In jq i numeri si possono confrontare usando i seguenti operatori relazionali e di uguaglianza.
| Confronto | Operatore |
|---|---|
| Maggiore di | a > b |
| Maggiore o uguale a | a >= b |
| Minore di | a < b |
| Minore o uguale a | a <= b |
| Uguale a | a == b |
| Diverso da | a != b |
Il risultato del confronto è sempre un valore booleano, quindi true o false.
1 < 3, # => true
2 != 2, # => false
1 == 1.0 # => true
# All numbers are floating-points, so this is different syntax
# for the exact same value.
Gli operatori di confronto precedenti possono essere usati anche per confrontare le stringhe. In tal caso, si applica un ordine lessicografico. L'ordinamento è in base al valore del punto di codice Unicode.
"Apple" > "Pear", # => false
"a" < "above", # => true
"a" == "A" # => false
Devi fare attenzione quando confronti due variabili che sembrano contenere valori numerici ma sono di tipo stringa. A causa dell'ordine lessicografico, il risultato non sarà lo stesso che confrontare valori di tipo numero.
10 < 2, # => false
"10" < "2" # => true (because "1" comes before "2")
L'operatore == di jq è simile a === di JavaScript, nel senso che le cose che «sembrano» uguali, ma sono di tipi diversi, non sono uguali.
"3" == 3 # => false
# the value on the left has type string,
# the value on the right has type number.
Due array sono uguali se tutti gli elementi corrispondenti sono uguali.
[1, 2, 3] == [1, 2, 3] # => true
[1, 2, 3] == [1, 3, 2] # => false, different order
[1, 2, 3] == [1, 2, "3"] # => false, different types
Due oggetti sono uguali se hanno le stesse coppie chiave-valore.
{name: "Joe", age: 42} == {age: 42, name: "Joe"} # => true
{name: "Joe", age: 42} == {age: 42, name: "Jane"} # => false
{name: "Joe", age: 42} == {age: "42", name: "Joe"} # => false
{name: "Joe", age: 42} == {age: 42, name: "Joe", height: 175} # => false
# comparisons will drill down as deeply as required
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2]}}} # => true
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2, 3]}}} # => false
L'espressione condizionale di jq è if A then B else C end.
if-then-else è un filtro come tutte le funzioni predefinite di jq: prende un input e produce un output.
Se l'espressione A produce un valore «veritiero», allora il filtro if valuta B.
Altrimenti valuta C.
L'input del filtro if verrà passato a B o C.
42 | if . < 50 then "small" else "big" end # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end # => 20
La clausola else è opzionale; le due istruzioni seguenti sono equivalenti.
if A then B else . end
if A then B end
Si possono aggiungere altre condizioni con elif.
42 | if . < 33 then "small"
elif . < 66 then "medium"
else "big"
end
# => "medium"
Usa tutte le clausole elif che ti servono.
Gli unici valori «falsi» in jq sono: false e null.
Tutto il resto è «vero», persino il numero zero e la stringa vuota, l'array vuoto e l'oggetto vuoto.
Gli operatori booleani and e or possono essere usati per costruire query complesse.
42 | if . < 33 or . > 66 then "big or small"
else "medium"
end
Per negare, usa not. Questo è un filtro, non un operatore.
42 | if (. < 33 or . > 66 | not) then "medium"
else "big or small"
end
L'operatore alternativo ti permette di specificare un valore «predefinito» se un'espressione è falsa o null.
A // B
# This is identical to
if A then A else B end
Per dimostrarlo
[3, 5, 18] | add / 2 # => 13
[] | add / 2 # => error: null (null) and number (2) cannot be divided
[] | add // 0 / 2 # => 0
In questo esercizio, scriverai del codice per aiutarti a prepararti all'acquisto di un veicolo.
Hai tre compiti: stabilire se ti servirà una patente; scegliere tra due veicoli; e stimare il prezzo accettabile per un veicolo usato.
Alcuni tipi di veicoli richiedono una patente di guida per essere guidati.
Supponi che solo i tipi "car" e "truck" richiedano una patente; tutto il resto può essere guidato senza.
Implementa la funzione needs_license che prende il tipo di veicolo e restituisce un booleano che indica se ti serve una patente per quel tipo di veicolo.
"car" | needs_license
# => true
"bike" | needs_license
# => false
Hai valutato le opzioni di veicoli disponibili.
Sei riuscito a restringerle a due, ma ti serve una mano per prendere la decisione finale.
Implementa la funzione choose_vehicle che prende come input un array di due veicoli e restituisce una decisione, cioè l'opzione che viene prima in ordine alfabetico.
["Wuling Hongguang", "Toyota Corolla"] | choose_vehicle
# => "Toyota Corolla is clearly the better choice."
["Volkswagen Beetle", "Volkswagen Golf"] | choose_vehicle
# => "Volkswagen Beetle is clearly the better choice."
Ora che hai preso la tua decisione, vuoi assicurarti di ottenere un prezzo equo dal concessionario. Dato che sei interessato a comprare un veicolo usato, il prezzo dipende da quanto è vecchio il veicolo. Per una stima approssimativa, supponi che se il veicolo ha meno di 3 anni, costi l'80% del prezzo originale che aveva quando era nuovo di zecca. Se ha più di 10 anni, costa il 50%. Se il veicolo ha almeno 3 anni ma non più di 10, costa il 70% del prezzo originale.
Implementa la funzione resell_price che applica questa logica usando if, elif ed else.
Prende un oggetto che contiene il prezzo originale e l'età del veicolo e restituisce il prezzo stimato dal concessionario.
{"original_price": 1000, "age": 1} | resell_price
# => 800
{"original_price": 1000, "age": 5} | resell_price
# => 700
{"original_price": 1000, "age": 15} | resell_price
# => 500
Iscriviti a Exercism per imparare e padroneggiare jq con 12 concetti75 esercizi e il mentoring di persone reali, tutto gratis.