In questo episodio del tutorial Perl vedremo come funziona il ciclo while in Perl.
use strict;
use warnings;
use 5.010;
my $counter = 10;
while ($counter > 0) {
say $counter;
$counter -= 2;
}
say 'fatto';
Il ciclo while
ha una condizione, nel nostro esempio il controllo se la variabile $counter è maggiore di 0,
e un blocco di codice tra parentesi graffe.
Quando l'esecuzione arriva per la prima volta all'inzio del ciclo while controlla se la condizione è vera o falsa. Se è FALSA
il blocco viene ignorato e viene eseguita l'istruzione successiva, nel nostro caso la stampa di 'fatto'.
Se la condizione del while
è VERA
, il blocco viene eseguito e si ritorna alla
condizione per valutarla di nuovo. Se è falsa il blocco viene ignorato e si stampa 'fatto'.
Se è vera il blocco viene eseguito e si torna alla condizione ...
Si va avanti così fintanto che la condizione è vera, ovvero, in Italo-Inglese:
while (la-condizione-è-vera) { fai-qualcosa }
Cicli infiniti
Nel codice qui sopra la variabile veniva sempre decrementata e quindi eravamo certi che prima o poi la condizione sarebbe diventata falsa.
Se, per qualche ragione, la condizione non diventa mai falsa avete creato un ciclo infinito
. Il vostro programma resterà bloccato in un
piccolo blocco dal quale non potrà mai uscire.
Per esempio, se avessimo dimenticato di decrementare $counter
oppure se lo avessimo incrementato
pur avendo, nella condizione, un controllo su un limite inferiore.
Se questo succede per errore, allora è certamente un bug.
D'altra parte, in alcuni casi l'uso volontario di un ciclo infinito può rendere il vostro programma più facile da scrivere e da leggere. E a noi piace molto il codice leggibile! Se vogliamo creare un ciclo infinito è sufficiente specificare una condizione sempre vera.
Possiamo quindi scrivere:
while (42) {
# fai qualcosa
}
Naturalmente le persone prive dei riferimenti culturali opportuni si chiederanno perché abbiamo scelto 42, quindi lo stile generalmente accettato, anche se un po' ripetitivo, è quello di specificare sempre il numero 1 nei cicli infiniti.
while (1) {
# fai qualcosa
}
Vedendo che il codice non può uscire da questo ciclo, viene naturale chiedersi come possa terminare l'intero programma a meno che venga interrotto dall'esterno.
In realtà, ci sono alcuni modi perché termini senza intervento esterno.
Uno di essi consiste nel chiamare l'istruzione last
nel ciclo while.
Il suo effetto è di ignorare il resto del blocco e non tornare più a controllare la condizione,
terminando di fatto il ciclo. Spesso viene usato all'interno di qualche condizione.
use strict;
use warnings;
use 5.010;
while (1) {
print "Quale linguaggio di programmazione stai imparando in questo momento? ";
my $name = <STDIN>;
chomp $name;
if ($name eq 'Perl') {
last;
}
say 'Sbagliato! Riprova!';
}
say 'fatto';
In questo esempio facciamo una domanda all'utente e speriamo che lui/lei sappia rispondere correttamente. Se non sarà capace di rispondere 'Perl' rimarrà nel ciclo a tentare per sempre di rispondere alla domanda.
La conversazione potrebbe svolgersi come segue:
Quale linguaggio di programmazione stai imparando in questo momento?
> Java
Sbagliato! Riprova!
Quale linguaggio di programmazione stai imparando in questo momento?
> PHP
Sbagliato! Riprova!
Quale linguaggio di programmazione stai imparando in questo momento?
> Perl
fatto
Come vedete, quando l'utente digita la risposta corretta viene chiamata last
, il resto del blocco
(incluso say 'Sbagliato! Riprova!';
) viene saltato e l'esecuzione continua dopo il
ciclo while
.