Successivo: Espressioni condizionali, Precedente: Tipi di variabile e confronti, Su: Valori e condizioni di verità [Contenuti][Indice]
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 ‘edu’ oppure ‘li’:
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’istruzionenext
.next
dice adawk
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’.
Questo programma ha un bug; stampa righe che iniziano con ‘END’. Come si può risolvere?
Successivo: Espressioni condizionali, Precedente: Tipi di variabile e confronti, Su: Valori e condizioni di verità [Contenuti][Indice]