If compatto
Riprendendo il discorso dalla lezione precedente, cè un altro
modo di usare listruzione 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
allespressione 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 allistruzione while, per prima
cosa valuta lespressione tra parentesi. Se questa è vera,
procede ad eseguire il blocco di istruzioni tra parentesi graffe,
poi ritorna a valutare lespressione. Se è ancora vera, riesegue
il blocco, e così via.
Quando lespressione 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 lespressione $a>0
viene valutata come vera, e viene sottratto 1 al valore di $a. Ma
dopo la quinta ripetizione, $a contiene 0, e lespressione
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 unespressione
che vi può confondere le idee: tra le parentesi si trova unintera
assegnazione tra array! Questo modo di scrivere è perfettamente
valido: per valutare unespressione del genere, il Perl per
prima cosa esegue lassegnazione; 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 listruzione each()? Ogni volta
che viene eseguita, ritorna un array contenente una coppia chiave-valore,
oppure un array vuoto quando larray tra parentesi è finito.
Bene, larray con la coppia rientra nel qualunque cosa
è vero di prima, mentre larray 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 larray
%altezza. Nellistruzione 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 dellarray. Che
larray 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