Tracks
/
jq
jq
/
Übungen
/
Lasagne
Lasagne

Lasagne

Lernübung

Einführung

Variablen

Zur Erinnerung: Ein jq-Programm ist eine Pipeline aus Ausdrücken. Variablenzuweisung folgt dieser Regel: Eine Variablenzuweisung ist ein Ausdruck, der so aussieht:

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

Der Filter gibt die Eingabe aus

Wie beim Identitätsausdruck . ist die Ausgabe der Variablenzuweisung dieselbe wie ihre Eingabe. Das Setzen des Variablenwerts ist ein Seiteneffekt.

Ein Beispiel, das zeigt, dass . nach der Zuweisung dieselbe Eingabe ist wie die ursprüngliche:

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

Gültigkeitsbereich von Variablen

Der Gültigkeitsbereich der Variable ist „lexikalisch“: Die Variable bleibt für den Rest der Pipeline im Gültigkeitsbereich. Variablen, die in Funktionen definiert werden (zu Funktionen kommen wir später), sind „lokal“ für die Funktion.

Variablennamen

Die Variable muss mit $ beginnen. Der Rest des Variablennamens ist ein Bezeichner: Er beginnt mit einem Buchstaben oder Unterstrich, gefolgt von Buchstaben, Zahlen oder Unterstrichen.

Destrukturierende Zuweisung

Aus dem Handbuch:

Mehrere Variablen lassen sich mit einem einzigen as-Ausdruck deklarieren, indem du ein Muster angibst, das zur Struktur der Eingabe passt (das nennt man „Destrukturierung“).

Beispiele:

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

Wenn der Variablenname zum Objektschlüssel passt, bietet das eine Abkürzung:

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

Dieselbe Abkürzung funktioniert in umgekehrter Richtung auch für die Objekterstellung

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

Konstanten

Wie das obige Beispiel zeigt, sind Variablen praktisch, um Konstanten zu speichern. Es ist besser, Konstanten einen Namen zu geben, als „magische Zahlen“ im Code auftauchen zu lassen.

Oft sind Variablen nicht nötig

Oft ist es lesbarer, auf Variablen zu verzichten.

Betrachte das Berechnen des Durchschnitts einer Liste von Zahlen

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

verglichen mit

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

Das zeigt einen der stärksten Aspekte von jq: Die Eingabe eines Filters steht jedem Teilausdruck zur Verfügung:

  • das Eingabe-Array [2,4,8,7] wird an add übergeben (das die Zahlen summiert, indem es den +-Operator auf alle Elemente anwendet)
  • parallel dazu wird [2,4,8,7] auch an length übergeben
  • wenn diese Teilausdrücke fertig sind, werden ihre Ergebnisse dividiert und ergeben den Durchschnitt der Zahlen im Eingabe-Array.

jq-Operatoren, die du für die Lernübung brauchst

Alternativ-Operator: //

Der Ausdruck a // b gibt b aus, wenn a falsch oder null ist, andernfalls gibt er a aus. Im Zusammenhang mit dem Setzen einer Variable ist das sehr praktisch, um einen Standardwert anzugeben:

(.input.theAnswer // 42) as $answer | ...
Arithmetische Operatoren
  • +, -, * sind die üblichen Operatoren für numerische Addition, Subtraktion und Multiplikation.

Anleitung

In dieser Übung schreibst du etwas Code, um eine großartige Lasagne aus deinem Lieblingskochbuch zuzubereiten.

Du hast vier Aufgaben, die alle mit der Zeit zu tun haben, die du für das Kochen der Lasagne brauchst.

1. Definiere die erwartete Backzeit in Minuten

Definiere eine Konstante mit dem Namen $expected_minutes_in_oven. Laut Kochbuch beträgt die erwartete Backzeit 40 Minuten:

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

2. Berechne die verbleibende Backzeit in Minuten

Dieser Wert nimmt die tatsächlichen Minuten, die die Lasagne bereits im Ofen war, als Eingabewert und gibt zurück, wie viele Minuten die Lasagne noch im Ofen bleiben muss. Grundlage dafür ist die erwartete Backzeit aus der vorherigen Aufgabe.

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

3. Berechne die Vorbereitungszeit in Minuten

Die Vorbereitungszeit ist die Zeit, die du brauchst, um die Lasagne fertigzumachen, bevor sie in den Ofen kommt. Für jede Schicht brauchst du 2 Minuten.

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

4. Berechne die gesamte Arbeitszeit in Minuten

Berechne, wie viele Minuten du insgesamt mit dem Kochen der Lasagne verbracht hast. Das ist die Summe aus der Vorbereitungszeit und der Zeit, die die Lasagne im Moment im Ofen verbracht hat.

$ echo '{"actual_minutes_in_oven": 10, "number_of_layers": 2}' | jq -f lasagna.jq
{
  ...
  "total_time": 14,
  ...
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
jq Exercism

Bereit, mit Lasagne zu starten?

Melde dich bei Exercism an, um jq mit 12 Konzepte75 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.