La prima e più elementare struttura di controllo è la if-else.
Permette di modificare il flusso delle istruzioni del programma a seconda che
una certa condizione sia o meno verificata.
La sintassi dell'istruzione è la seguente:
if ( |
condizione) { |
|
primo blocco di istruzioni |
} else { |
|
secondo blocco di istruzioni |
} |
Se la condizione è vera allora viene eseguito il primo blocco di istruzioni
racchiuso tra parentesi graffe, altrimenti viene eseguito il secondo blocco di
istruzioni. Al termine di ognuno dei due blocchi il flusso del programma
riprende con le istruzioni presenti dopo la chiusura dell'ultima parentesi
graffa.
Il blocco else può essere omesso:
if ( |
condizione) { |
|
blocco di istruzioni |
} |
In questo caso se la condizione è verificata allora viene eseguito il blocco
di istruzioni riportato tra parentesi graffe, quindi l'esecuzione del programma
continuerà con le istruzioni che seguono la parentesi graffa chiusa; se invece
la condizione risulta falsa allora il blocco di istruzioni tra parentesi graffe
non viene eseguito ed il programma continua semplicemente saltando il blocco.
La struttura di controllo if ha alcune interessanti variazioni che
rendono in certi casi più sintetico il programma. Ad esempio è possibile
utilizzare la notazione post-fissa:
istruzione if condizione;
In questo caso l'istruzione (singola) viene eseguita solo se è verificata la
condizione (che con la notazione post-fissa può non essere racchiusa tra
parentesi tonde).
Un altro modo di utilizzare una struttura di controllo simile alla
if è, come accennavo precedentemente, quello di sfruttare il fatto che
l'esecuzione di ogni istruzione in Perl restituisce un valore che può essere
interpretato come vero o falso.
Supponiamo quindi di voler eseguire l'istruzione istruz2
solo se l'istruzione istruz1 va a buon fine (restituisce un
valore vero); potremo allora utilizzare l'operatore AND e concatenare le due
istruzioni con la seguente espressione:
istruz1 &&
istruz2;
L'espressione appena vista equivale a scrivere
if ( |
istruz1) { |
|
istruz2; |
} |
Viceversa se si vuole eseguire l'istruzione istruz2 solo
se l'istruzione istruz1 restituisce un valore falso, potremo
utilizzare la seguente espressione:
istruz1 || istruz2;
che equivale alla struttura canonica:
if ( |
! istruz1) { |
|
istruz2; |
} |
Cerchiamo di chiarire meglio questo comportamento assai interessante del
Perl, ma piuttosto insolito se confrontato con altri linguaggi di
programmazione.
Innanzi tutto negli esempi precedenti abbiamo utilizzato una istruzione al
pari di una espressione logica. La differenza tra questi due oggetti è piuttosto
marcata: una istruzione serve per compiere una determinata operazione (scrivere
qualcosa sul canale di output, eseguire una operazione matematica, eseguire una
operazione su una stringa di caratteri, ecc.), mentre una espressione logica è
un oggetto che in base al valore logico (vero o falso) delle sue componenti ci
fornisce un valore logico (vero o falso). In Perl però le due cose si confondono
visto che ogni istruzione restituisce comunque un valore che può essere
interpretato in termini logici, ossia in termini di ``vero o
falso''.
Quindi non è sbagliato utilizzare una istruzione come operatore logico che ci
premette di compiere una decisione.
In secondo luogo è importante capire il modo in cui il Perl valuta le
espressioni logiche. Come per ogni espressione si parte da sinistra e si procede
verso destra nella valutazione delle componenti; le parentesi servono a
stabilire priorità diverse da quelle standard. Inoltre, per ottimizzare i tempi
di esecuzione, il Perl interrompe la valutazione di una espressione logica non
appena è in grado di stabilirne il valore di vero o falso.
Quindi nel caso di una espressione del tipo ``A AND B'' (in
Perl scriveremo ``A && B'') se dopo aver valutato
l'espressione logica A si ottiene un valore falso, allora il Perl non
valuterà l'espressione B, visto che questa operazione risulterebbe
comunque inutile al fine della valutazione dell'espressione ``A AND
B'' (l'operatore logico AND restituisce vero se e solo se entrambi i
termini sono veri). L'espressione B verrà quindi valutata solo se
l'espressione A risulta vera.
Viceversa nella valutazione dell'espressione logica ``A OR B''
se il termine A risulta vero allora il Perl non valuterà il termine
B, visto che comunque basta che uno dei due termini sia vero per
stabilire il valore (vero) dell'intera espressione. Se il termine A
risulta falso allora il Perl non essendo ancora in grado di stabilire il valore
dell'intera espressione ``A OR B'' e quindi procederà alla
valutazione anche del secondo termine.