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 | ...
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 „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ó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.
A kézikönyvből:
Egyetlen
askifejezé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]]
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}
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 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:
[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)[2,4,8,7] a length-nek is átadódikjq operátorok, amelyekre szükséged lesz a tanulófeladatban//
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 | ...
+, -, * a szokásos numerikus összeadás, kivonás és szorzás operátorai.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.
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,
...
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,
...
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,
...
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,
...
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.