Λαζάνια

Λαζάνια

Άσκηση εκμάθησης

Εισαγωγή

Μεταβλητές

Θυμήσου ότι ένα πρόγραμμα 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]]
Note

Η ίδια συντόμευση λειτουργεί και αντίστροφα για την κατασκευή αντικειμένων

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 | ...
Αριθμητικοί τελεστές
  • Τα +, -, * είναι οι συνήθεις τελεστές αριθμητικής πρόσθεσης, αφαίρεσης και πολλαπλασιασμού.

Οδηγίες

Σε αυτή την άσκηση θα γράψεις λίγο κώδικα για να φτιάξεις μια καταπληκτική λαζάνια από το αγαπημένο σου βιβλίο μαγειρικής.

Έχεις τέσσερις εργασίες, όλες σχετικές με τον χρόνο που χρειάζεται για το ψήσιμο της λαζάνιας.

1. Όρισε τον αναμενόμενο χρόνο ψησίματος σε λεπτά

Όρισε μια σταθερά με το όνομα $expected_minutes_in_oven. Σύμφωνα με το βιβλίο μαγειρικής, ο αναμενόμενος χρόνος ψησίματος σε λεπτά είναι 40:

$ jq -n -f lasagna.jq
{
  "expected_minutes_in_oven": 40,
  ...

2. Υπολόγισε τον χρόνο ψησίματος που απομένει σε λεπτά

Αυτή η τιμή παίρνει ως είσοδο τα πραγματικά λεπτά που έχει ήδη ψηθεί η λαζάνια και επιστρέφει πόσα λεπτά πρέπει ακόμα να παραμείνει η λαζάνια στον φούρνο, με βάση τον αναμενόμενο χρόνο ψησίματος σε λεπτά από την προηγούμενη εργασία.

$ echo '{"actual_minutes_in_oven": 18}' | jq -f lasagna.jq
{
  "expected_minutes_in_oven": 40,
  "remaining_minutes_in_oven": 22,
  ...

3. Υπολόγισε τον χρόνο προετοιμασίας σε λεπτά

Ο χρόνος προετοιμασίας είναι όσος χρόνος χρειάζεται για να ετοιμαστεί η λαζάνια πριν μπει στον φούρνο. Χρειάζονται 2 λεπτά για να προετοιμάσεις κάθε στρώση.

$ echo '{"number_of_layers": 3}' | jq -f lasagna.jq
{
  ...
  "preparation_time": 6,
  ...

4. Υπολόγισε τον συνολικό χρόνο εργασίας σε λεπτά

Υπολόγισε πόσα λεπτά συνολικά έχεις δουλέψει για το μαγείρεμα της λαζάνιας. Αυτό είναι το άθροισμα του χρόνου προετοιμασίας σε λεπτά και του χρόνου σε λεπτά που έχει περάσει η λαζάνια στον φούρνο μέχρι στιγμής.

$ echo '{"actual_minutes_in_oven": 10, "number_of_layers": 2}' | jq -f lasagna.jq
{
  ...
  "total_time": 14,
  ...
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
jq Exercism

Έτοιμος να ξεκινήσεις την άσκηση Λαζάνια;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις jq με 12 έννοιες75 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.