indietro

  • redo ETICHETTA
  • redo

    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.