Successivo: , Precedente: , Su: Tipi di variabile e confronti   [Contenuti][Indice]


6.3.2.2 Operatori di confronto

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.

EspressioneRisultato
x < yVero se x è minore di y
x <= yVero se x è minore o uguale a y
x > yVero se x è maggiore di y
x >= yVero se x è maggiore o uguale a y
x == yVero se x è uguale a y
x != yVero se x è diverso da y
x ~ yVero se la stringa x corrisponde alla regexp rappresentata da y
x !~ yVero se la stringa x non corrisponde alla regexp rappresentata da y
indice in vettoreVero se il vettore vettore ha un elemento con indice indice

Tabella 6.3: Operatori di relazione

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: , Precedente: , Su: Tipi di variabile e confronti   [Contenuti][Indice]