Successivo: , Precedente: , Su: Valori e condizioni di verità   [Contenuti][Indice]


6.3.3 Espressioni booleane

Un’espressione booleana è una combinazione di espressioni di confronto o espressioni di ricerca, che usa gli operatori booleani "or" (‘||’), "and" (‘&&’), e "not" (‘!’), facendo uso di parentesi per controllare le nidificazioni. Il valore di verità dell’espressione booleana è calcolato calcolando i valori di verità delle espressioni componenti. Le espressioni booleane sono conosciute anche come espressioni logiche. I due termini sono equivalenti.

Le espressioni booleane possono essere usate in tutti i casi in cui è possibile usare espressioni di confronto e di ricerca di corrispondenze. Si possono usare nelle istruzioni if, while, do e for (vedi la sezione Istruzioni di controllo nelle azioni). Hanno valori numerici (uno se vero, zero se falso) che entrano in gioco se il risultato di un’espressione booleana è memorizzato in una variabile o se è usato nei calcoli.

Inoltre, ogni espressione booleana è anche un modello di ricerca valido, così se ne può usare uno come modello di ricerca per controllare l’esecuzione di regole. Gli operatori booleani sono:

booleano1 && booleano2

Vero se booleano1 e booleano2 sono entrambi veri. Per esempio, la seguente istruzione stampa il record in input corrente se contiene sia ‘edu’ che ‘li’:

if ($0 ~ /edu/ && $0 ~ /li/) print

La sottoespressione booleano2 viene valutata solo se booleano1 è vero. Questo può comportare una differenza laddove booleano2 contenga espressioni che hanno effetti collaterali. Nel caso di ‘$0 ~ /pippo/ && ($2 == pluto++)’, la variabile pluto non viene incrementata se non c’è nessuna sottostringa ‘pippo’ nel record.

booleano1 || booleano2

Vero se almeno uno tra booleano1 e booleano2 è vero. Per esempio, la seguente istruzione stampa tutti i record dell’input che contengono ‘eduoppureli’:

if ($0 ~ /edu/ || $0 ~ /li/) print

La sottoespressione booleano2 viene valutata solo se booleano1 è falso. Questo può comportare una differenza quando booleano2 contiene espressioni che hanno effetti collaterali. (Perciò, questo confronto non individua mai i record che contengono sia ‘edu’ che ‘li’: non appena ‘edu’ viene trovato, l’intero confronto è concluso positivamente.)

! booleano

Vero se booleano è falso. Per esempio, il seguente programma stampa ‘nessuna home!’ nel caso insolito che la variabile d’ambiente HOME non sia stata definita:

BEGIN { if (! ("HOME" in ENVIRON))
            print "nessuna home!" }

(L’operatore in è descritto in Come esaminare un elemento di un vettore.)

Gli operatori ‘&&’ e ‘||’ sono chiamati operatori di cortocircuito per il modo in cui funzionano. La valutazione dell’intera espressione è "cortocircuitata" se il risultato può già essere determinato prima di aver completato interamente la valutazione.

Le istruzioni che finiscono con ‘&&’ o ‘||’ si possono continuare semplicemente mettendo un ritorno a capo dopo di esse. Però non si può mettere un ritorno a capo prima di questi operatori senza usare la continuazione tramite la barra inversa (vedi la sezione Istruzioni e righe in awk).

Il valore reale di un’espressione che usa l’operatore ‘!’ è uno o zero, a seconda del valore di verità dell’espressione a cui è applicato. L’operatore ‘!’ spesso è utile per cambiare il senso di una variabile indicatore [flag] da falso a vero e viceversa. Per esempio, il seguente programma è un modo per stampare righe poste tra due speciali righe delimitatrici:

$1 == "START"   { pertinente = ! pertinente; next }
pertinente      { print }
$1 == "END"     { pertinente = ! pertinente; next }

La variabile pertinente, così come tutte le variabili di awk, è inizializzata a zero, che vale anche "falso". Quando viene trovata una riga il cui primo campo è ‘START’, il valore di pertinente viene commutato a vero, usando ‘!’. La regola nella riga seguente stampa righe finché pertinente resta vero. Quando viene trovata una riga il cui primo campo è ‘END’, pertinente viene nuovamente commutata a falso.37

Più comunemente, l’operatore ‘!’ viene usato nelle condizioni delle istruzioni if e while, dove ha più senso formulare espressioni logiche in negativo:

if (! qualche condizione || qualche altra condizione) {
    … fai un'operazione a piacere …
}

NOTA: L’istruzione next viene trattata in L’istruzione next. next dice ad awk di tralasciare il resto delle regole, leggere il record successivo, e iniziare a elaborare le regole partendo nuovamente dalla prima. Il motivo è quello di evitare di stampare le righe delimitatrici ‘START’ e ‘END’.


Note a piè di pagina

(37)

Questo programma ha un bug; stampa righe che iniziano con ‘END’. Come si può risolvere?


Successivo: , Precedente: , Su: Valori e condizioni di verità   [Contenuti][Indice]