Lasagne

Lasagne

Tanulófeladat

Bevezetés

Változók

Emlékezz vissza arra, hogy a jq program kifejezések csővezetéke. A változóhozzárendelés szabálya a következő: a változóhozzárendelés egy olyan kifejezés, amely így néz ki:

... | expr as $varname | ...

A szűrő kimenete a bemenet

Ahogy az identitáskifejezés . esetében, a változóhozzárendelés kimenete is ugyanaz, mint a bemenete. A változó értékének beállítása mellékhatás.

Példa, amely megmutatja, hogy a hozzárendelés utáni . ugyanaz, mint a kezdeti bemenet:

$ jq -c -n '42 | (. * 2) as $double | [., $double]'
[42,84]

A változó scope-ja

A változó scope-ja „lexikális”: a változó a csővezeték hátralévő részében marad scope-ban. A függvényekben definiált változók (a függvényekre később térünk rá) a függvényen belül „lokálisak”.

A változók nevei

A változónak $ jellel kell kezdődnie. A változónév többi része egy azonosító: betűvel vagy aláhúzásjellel kezdődik, amelyet betűk, számok vagy aláhúzásjelek követnek.

Destrukturáló hozzárendelés

A kézikönyvből:

Egyetlen as kifejezéssel több változó is deklarálható, ha olyan mintát adunk meg, amely illeszkedik a bemenet szerkezetéhez (ezt nevezik „destrukturálásnak”).

Példák:

[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]

A változó nevének az objektumkulcshoz igazítása egyszerűsítést kínál:

{"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

Ugyanez a rövidítés fordított értelemben az objektumépítésnél is működik

4 as $x | 7 as $y | {$x, $y}    # => {"x":4, "y": 7}

Konstansok

Ahogy a fenti példa is mutatja, a változók kényelmesen használhatók konstansok tárolására. Jobb nevet adni a konstansoknak, mint hagyni, hogy „mágikus számok” jelenjenek meg a kódban.

Gyakran nincs szükség változókra

Gyakran olvashatóbb, ha elhagyjuk a változókat.

Nézzük meg, hogyan számítható ki egy számlista átlaga

[2, 4, 8, 7]
| add as $sum
| length as $len
| $sum / $len

összehasonlítva ezzel:

[2, 4, 8, 7] | add / length

Ez jól mutatja a jq egyik legerősebb tulajdonságát: a szűrő bemenetét minden rész-kifejezés megkapja:

  • a [2,4,8,7] bemeneti tömb átadódik az add-nek (amely úgy adja össze a számokat, hogy a + operátort minden elemre alkalmazza)
  • ezzel párhuzamosan a [2,4,8,7] a length-nek is átadódik
  • amikor ezek a rész-kifejezések befejeződnek, az eredményeiket elosztjuk, így megkapjuk a bemeneti tömb számainak átlagát.

jq operátorok, amelyekre szükséged lesz a tanulófeladatban

Alternatív operátor: //

Az a // b kifejezés b-t adja eredményül, ha a hamis vagy null, egyébként a-t adja. Változó beállításánál ez nagyon hasznos egy alapértelmezett érték megadásához:

(.input.theAnswer // 42) as $answer | ...
Aritmetikai operátorok
  • A +, -, * a szokásos numerikus összeadás, kivonás és szorzás operátorai.

Utasítások

Ebben a feladatban kódot írsz majd, hogy a kedvenc szakácskönyvedből egy ragyogó lasagnét készíthess.

Négy részfeladatod van, mindegyik a lasagna elkészítésével töltött időhöz kapcsolódik.

1. Definiáld a sütőben töltött várható időt percekben

Definiálj egy $expected_minutes_in_oven nevű konstanst. A szakácskönyv szerint a sütőben töltött várható idő 40 perc:

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

2. Számítsd ki a hátralévő sütési időt percekben

Ez az érték bemenetként a lasagna sütőben töltött tényleges perceit kapja, és visszaadja, hány percet kell még a lasagnának a sütőben maradnia, az előző részfeladat várható sütési ideje alapján.

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

3. Számítsd ki az előkészítési időt percekben

Az előkészítési idő azt jelenti, mennyi ideig tart, míg a lasagna elkészül, mielőtt a sütőbe kerül. Minden réteg elkészítése 2 percet vesz igénybe.

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

4. Számítsd ki a teljes munkával töltött időt percekben

Számítsd ki, hogy összesen hány percet dolgoztál a lasagna elkészítésén. Ez az előkészítési idő percekben mért értékének és a lasagna által a sütőben eddig eltöltött perceknek az összege.

$ echo '{"actual_minutes_in_oven": 10, "number_of_layers": 2}' | jq -f lasagna.jq
{
  ...
  "total_time": 14,
  ...
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
jq Exercism

Készen állsz elkezdeni a(z) Lasagne feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) jq nyelvet 12 fogalom75 feladat segítségével, valódi emberi mentorálással, mindez ingyen.