Struttura condizionale if-else

Guida a Perl
di M. Liverani

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.

© Risorse.net (www.risorse.net)
pagina in versione stampabile:
http://www.risorse.net /perl/if-else.asp?print=ok