Il comando redo fa ripartire il blocco del ciclo senza valutare di
nuovo l'espressione condizionale. Il blocco continue, se presente,
non viene eseguito. Se l'ETICHETTA viene omessa, il comando si riferisce
al ciclo più interno che lo include. Sono quei programmi che vogliono
ingannare loro stessi a proposito dell'input, ad usare di solito questo comando:
# un semplice programma che rimuove i commenti da codice Pascal
# (attenzione: si assume che le stringhe non contengano { oppure } )
LINE: while (<STDIN>) {
while (s|({.*}.*){.*}|$1 |) {}
s|{.*}| |;
if (s|{.*| |) {
$anteriore = $_;
while (<STDIN>) {
if (/}/) { # fine del commento?
s|^|$anteriore\{|;
redo LINE;
}
}
}
print;
}
redo non può essere usata per fare rieseguire un blocco
che restituisce un valore, come eval {}, sub {} oppure do {},
e non dovrebbe essere usata per uscire da una operazione di grep() o map().
Va notato che un blocco di per sé è semanticamente
identico ad un ciclo che viene eseguito una volta sola. Dunque
redo all'interno di un tale blocco sarà effettivamente
trasformato in un costrutto iterativo.
Consultate anche continue per una illustrazione di come lavorano
last, next e redo.
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per
porre quesiti di tipo tecnico, per rimanere aggiornato su meeting,
incontri, manifestazioni e novità su Perl.it. Iscriviti!