Successivo: Confronto POSIX di stringhe, Precedente: Tipi di variabile, Su: Tipi di variabile e confronti [Contenuti][Indice]
Le espressioni di confronto confrontano stringhe o numeri per metterli in relazione tra di loro, come ad esempio nella relazione di uguaglianza. Sono scritte usando operatori di relazione, che sono un superinsieme di quelli in C. Sono descritti nella Tabella 6.3.
Espressione | Risultato |
---|---|
x < y | Vero se x è minore di y |
x <= y | Vero se x è minore o uguale a y |
x > y | Vero se x è maggiore di y |
x >= y | Vero se x è maggiore o uguale a y |
x == y | Vero se x è uguale a y |
x != y | Vero se x è diverso da y |
x ~ y | Vero se la stringa x corrisponde alla regexp rappresentata da y |
x !~ y | Vero se la stringa x non corrisponde alla regexp rappresentata da y |
indice in vettore | Vero se il vettore vettore ha un elemento con indice indice |
Le espressioni di confronto valgono uno se sono vere e zero se false.
Quando si confrontano operandi di tipi diversi, gli operandi numerici sono
convertiti in stringhe usando il valore di CONVFMT
(vedi la sezione Conversione di stringhe e numeri).
Il confronto tra stringhe avviene
confrontando il primo carattere di ciascuna stringa, poi il secondo carattere,
e così via. Quindi, "10"
è minore di "9"
. Se vi sono due
stringhe di cui una è il prefisso dell’altra, la stringa più corta è minore di
quella più lunga. Così, "abc"
è minore di "abcd"
.
È molto facile sbagliarsi scrivendo l’operatore ‘==’ e
omettendo uno dei due caratteri ‘=’. Il risultato è sempre un codice
awk
valido, ma il programma non fa quel che si voleva:
if (a = b) # oops! dovrebbe essere == b … else …
A meno che b
non sia zero o la stringa nulla, la parte if
del test ha sempre successo. Poiché gli operatori sono molto simili,
questo tipo di errore è molto difficile da individuare
rileggendo il codice sorgente.
Il seguente elenco di espressioni illustra il tipo di confronti
che awk
effettua e il risultato di ciascun confronto:
1.5 <= 2.0
Confronto numerico (vero)
"abc" >= "xyz"
Confronto tra stringhe (falso)
1.5 != " +2"
Confronto tra stringhe (vero)
"1e2" < "3"
Confronto tra stringhe (vero)
a = 2; b = "2"
a == b
Confronto tra stringhe (vero)
a = 2; b = " +2"
a == b
Confronto tra stringhe (falso)
In quest’esempio:
$ echo 1e2 3 | awk '{ print ($1 < $2) ? "vero" : "falso" }' -| falso
il risultato è ‘falso’ perché sia $1
che $2
sono immessi dall’utente. Sono stringhe numeriche — quindi hanno entrambe
l’attributo strnum, che richiede un confronto di tipo numerico.
Lo scopo delle regole di confronto e dell’uso di stringhe numeriche è quello
di cercare di produrre il comportamento "meno inaspettato possibile",
pur "facendo la cosa giusta".
I confronti di stringhe e i confronti di espressioni regolari sono molto diversi. Per esempio:
x == "att"
ha il valore uno, ossia è vero, se la variabile x
è precisamente ‘att’. Al contrario:
x ~ /att/
ha il valore uno se x
contiene ‘att’, come
"Oh, che matto che sono!"
.
L’operando di destra degli operatori ‘~’ e ‘!~’ può essere sia una
costante regexp (/
…/
) che un’espressione ordinaria.
In quest’ultimo caso, il valore dell’espressione come stringa è usato come una
regexp dinamica (vedi la sezione Uso di espressioni regolari; e
vedi la sezione Usare regexp dinamiche).
Un’espressione regolare costante tra due barre è di per sé anche
un’espressione. /regexp/
è un’abbreviazione per la seguente
espressione di confronto:
$0 ~ /regexp/
Una particolare posizione dove /pippo/
non è un’abbreviazione di
‘$0 ~ /pippo/’ è quella in cui è l’operando di destra di ‘~’ o
‘!~’.
Vedi la sezione Usare espressioni regolari come costanti,
dove questo punto è trattato in maggiore dettaglio.
Successivo: Confronto POSIX di stringhe, Precedente: Tipi di variabile, Su: Tipi di variabile e confronti [Contenuti][Indice]