Corso di Perl

Strutture di controllo: while

 

If compatto

Riprendendo il discorso dalla lezione precedente, c’è un altro modo di usare l’istruzione if, più veloce:

$quoziente = $dividendo / $divisore if $divisore != 0;


Questo modo di scrivere è più simile al linguaggio naturale: “fai la divisione se il divisore è diverso da 0”. Però può essere più difficile da leggere, e si può usare solo per istruzioni singole (niente blocchi). Notate che, in questo caso, le parentesi attorno all’espressione non sono necessarie. Insomma, questo è un modo di realizzare una semplice istruzione if senza stare a digitare troppa punteggiatura.

Il ciclo while

Il concetto di ciclo è fondamentale nella programmazione: si ha un ciclo quando una certa serie di istruzioni viene eseguita più volte, con delle espressioni che controllano come e quante volte viene effettuata la ripetizione. Uno dei più semplici, ma comunque importanti, è il ciclo while:

while (espressione)
                {
                blocco
                }

Quando il Perl arriva all’istruzione while, per prima cosa valuta l’espressione tra parentesi. Se questa è vera, procede ad eseguire il blocco di istruzioni tra parentesi graffe, poi ritorna a valutare l’espressione. Se è ancora vera, riesegue il blocco, e così via.

Quando l’espressione non è più vera, il blocco viene saltato e il programma riprende la sua normale esecuzione in sequenza. Facciamo un esempio molto semplice:

$a=5;
while ( $a>0 )
                {
                $a = $a –1;
                }


In questo caso, abbiamo come blocco una singola istruzione, che ha come effetto di sottrarre 1 al valore contenuto in $a. Quante volte verrà eseguita? Non ci vuole molto a capire che verrà ripetuta un totale di 5 volte: ogni volta l’espressione “$a>0” viene valutata come vera, e viene sottratto 1 al valore di $a. Ma dopo la quinta ripetizione, $a contiene 0, e l’espressione non è più vera.

Facciamo un altro esempio, sfruttando il programma che abbiamo realizzato nelle lezioni dalla 9 alla 11. Ricordate la fase di calcolo delle medie? La riporto qui:

($nome, $a1) = each( %altezza);
($nome, $a2) = each( %altezza);
($nome, $a3) = each( %altezza);
($nome, $a4) = each( %altezza);
($nome, $a5) = each( %altezza);
$media = ($a1 + $a2 + $a3 + $a4 + $a5) / 5;
print “Media: $media\n”;


Francamente, questo codice è uno schifo. Sfruttando if e while, possiamo scrivere qualcosa di molto migliore:

$media=0;
while(($chiave, $valore) = each( %altezza))
                {
                $media = $media + $valore;
                }
$media = $media / keys (%altezza) if keys (%altezza) != 0;
print “Media: $media\n”;

Per queste righe ho sfruttato alcune caratteristiche del Perl che permettono di scrivere un codice molto conciso, perciò analizziamole ad una ad una.
La prima riga mette a zero la variabile $media, che useremo per fare i conti.
La seconda apre il ciclo while, ed ha un’espressione che vi può confondere le idee: tra le parentesi si trova un’intera assegnazione tra array! Questo modo di scrivere è perfettamente valido: per valutare un’espressione del genere, il Perl per prima cosa esegue l’assegnazione; il valore da valutare come “vero” o “falso” è il valore che è stato assegnato, e in pratica qualunque cosa viene valutata come “vero”, a meno che non sia una stringa vuota, un array vuoto o cose del genere.
Ricordate come funziona l’istruzione each()? Ogni volta che viene eseguita, ritorna un array contenente una coppia chiave-valore, oppure un array vuoto quando l’array tra parentesi è finito. Bene, l’array con la coppia rientra nel “qualunque cosa è vero” di prima, mentre l’array vuoto non è niente. Non è un “valore qualunque”, perciò viene valutato come “falso”.

 

Chiarito questo, possiamo vedere che il ciclo while verrà eseguito tante volte quante coppie chiave-valore ha l’array %altezza. Nell’istruzione che viene ripetuta, i valori vengono sommati ad uno ad uno. Una volta usciti dal ciclo, il totale viene diviso per il numero di elementi (sempre che non sia zero) e stampato.

I vantaggi di calcolare la media in questo modo sono:
1. Il codice è indipendente dalla lunghezza dell’array. Che l’array sia lungo 10 o 10.000 elementi non importa, funziona lo stesso, mentre la precedente versione era scritta per un array di esattamente 5 elementi.
2. Abbiamo usato un costrutto più complicato, perciò siamo dei ganzi. Voglio dire, come vedete è possibile scrivere codice molto compatto e difficile da interpretare alla prima occhiata. Perciò non esagerate :-)

 

Torna all'indice Generale del corso di Corso di Perl di Software Planet