Θυμήσου ότι ένα πρόγραμμα jq είναι ένα pipeline από εκφράσεις.
Η εκχώρηση μεταβλητής ακολουθεί αυτόν τον κανόνα: μια εκχώρηση μεταβλητής είναι μια έκφραση που μοιάζει με:
... | expr as $varname | ...
Όπως η έκφραση ταυτότητας ., η έξοδος της εκχώρησης μεταβλητής είναι ίδια με την είσοδό της.
Ο ορισμός της τιμής της μεταβλητής είναι μια παρενέργεια.
Παράδειγμα, που δείχνει ότι το . μετά την εκχώρηση είναι το ίδιο με την αρχική είσοδο:
$ jq -c -n '42 | (. * 2) as $double | [., $double]'
[42,84]
Η εμβέλεια της μεταβλητής είναι "λεξική", δηλαδή η μεταβλητή θα βρίσκεται σε εμβέλεια για το υπόλοιπο του pipeline. Οι μεταβλητές που ορίζονται μέσα σε συναρτήσεις (θα ασχοληθούμε με τις συναρτήσεις αργότερα) είναι "τοπικές" στη συνάρτηση.
Η μεταβλητή πρέπει να ξεκινά με $.
Το υπόλοιπο του ονόματος της μεταβλητής είναι ένα αναγνωριστικό: ξεκινά με ένα γράμμα ή κάτω παύλα και ακολουθείται από γράμματα, αριθμούς ή κάτω παύλες.
Από το εγχειρίδιο:
Πολλαπλές μεταβλητές μπορούν να δηλωθούν χρησιμοποιώντας μία μόνο έκφραση
as, παρέχοντας ένα μοτίβο που ταιριάζει με τη δομή της εισόδου (αυτό είναι γνωστό ως "αποδόμηση").
Παραδείγματα:
[1, 2, 3] as [$a, $b, $c]
| [$a, $b, $c] # => [1, 2, 3]
{"foo": "bar", "len": [10, 20]} as {foo: $f, len: [$h, $w]}
| [$f, $h, $w] # => ["bar", 10, 20]
Το ταίριασμα του ονόματος της μεταβλητής με το κλειδί του αντικειμένου προσφέρει μια συντόμευση:
{"x": 4, "y": 7} as {$x, $y}
| [$x, $y] # => [4, 7]
{"foo": "bar", "len": [10, 20]} as {$foo, $len}
| [$foo, $len] # => ["bar", [10, 20]]
Η ίδια συντόμευση λειτουργεί και αντίστροφα για την κατασκευή αντικειμένων
4 as $x | 7 as $y | {$x, $y} # => {"x":4, "y": 7}
Όπως φαίνεται στο παραπάνω παράδειγμα, οι μεταβλητές είναι βολικές για την αποθήκευση σταθερών. Είναι καλύτερα να δίνεις ένα όνομα στις σταθερές παρά να εμφανίζονται "μαγικοί αριθμοί" μέσα στον κώδικα.
Συχνά είναι πιο ευανάγνωστο να παραλείπεις τις μεταβλητές.
Σκέψου τον υπολογισμό του μέσου όρου μιας λίστας αριθμών
[2, 4, 8, 7]
| add as $sum
| length as $len
| $sum / $len
σε σύγκριση με
[2, 4, 8, 7] | add / length
Αυτό αναδεικνύει μια από τις πιο ισχυρές πτυχές του jq: η είσοδος σε ένα φίλτρο παρέχεται σε κάθε υποέκφραση:
[2,4,8,7] περνά στο add (το οποίο αθροίζει τους αριθμούς εφαρμόζοντας τον τελεστή + σε όλα τα στοιχεία)[2,4,8,7] περνά επίσης στο length
jq που θα χρειαστείς για την άσκηση εκμάθησης//
Η έκφραση a // b δίνει ως έξοδο το b αν το a είναι ψευδές ή null, αλλιώς δίνει ως έξοδο το a.
Στο πλαίσιο του ορισμού μιας μεταβλητής, αυτό είναι πολύ βολικό για να παρέχεις μια προεπιλεγμένη τιμή:
(.input.theAnswer // 42) as $answer | ...
+, -, * είναι οι συνήθεις τελεστές αριθμητικής πρόσθεσης, αφαίρεσης και πολλαπλασιασμού.Σε αυτή την άσκηση θα γράψεις λίγο κώδικα για να φτιάξεις μια καταπληκτική λαζάνια από το αγαπημένο σου βιβλίο μαγειρικής.
Έχεις τέσσερις εργασίες, όλες σχετικές με τον χρόνο που χρειάζεται για το ψήσιμο της λαζάνιας.
Όρισε μια σταθερά με το όνομα $expected_minutes_in_oven.
Σύμφωνα με το βιβλίο μαγειρικής, ο αναμενόμενος χρόνος ψησίματος σε λεπτά είναι 40:
$ jq -n -f lasagna.jq
{
"expected_minutes_in_oven": 40,
...
Αυτή η τιμή παίρνει ως είσοδο τα πραγματικά λεπτά που έχει ήδη ψηθεί η λαζάνια και επιστρέφει πόσα λεπτά πρέπει ακόμα να παραμείνει η λαζάνια στον φούρνο, με βάση τον αναμενόμενο χρόνο ψησίματος σε λεπτά από την προηγούμενη εργασία.
$ echo '{"actual_minutes_in_oven": 18}' | jq -f lasagna.jq
{
"expected_minutes_in_oven": 40,
"remaining_minutes_in_oven": 22,
...
Ο χρόνος προετοιμασίας είναι όσος χρόνος χρειάζεται για να ετοιμαστεί η λαζάνια πριν μπει στον φούρνο. Χρειάζονται 2 λεπτά για να προετοιμάσεις κάθε στρώση.
$ echo '{"number_of_layers": 3}' | jq -f lasagna.jq
{
...
"preparation_time": 6,
...
Υπολόγισε πόσα λεπτά συνολικά έχεις δουλέψει για το μαγείρεμα της λαζάνιας. Αυτό είναι το άθροισμα του χρόνου προετοιμασίας σε λεπτά και του χρόνου σε λεπτά που έχει περάσει η λαζάνια στον φούρνο μέχρι στιγμής.
$ echo '{"actual_minutes_in_oven": 10, "number_of_layers": 2}' | jq -f lasagna.jq
{
...
"total_time": 14,
...
Γράψου στο Exercism για να μάθεις και να κατακτήσεις jq με 12 έννοιες75 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.