Unterschied zwischen next und redo

22/03/2013 - 17:45 von Ying Gan | Report spam
Ich verstehe nicht genau den Unterschied zwischen next und redo.
Kann mir da jemand mit einem Beispiel helfen? Vielen Dank!!!
 

Lesen sie die antworten

#1 Christian Winter
22/03/2013 - 19:58 | Warnen spam
Am 22.03.2013 17:45, schrieb Ying Gan:
Ich verstehe nicht genau den Unterschied zwischen next und redo.
Kann mir da jemand mit einem Beispiel helfen? Vielen Dank!!!



"next" wertet die Bedingung aus, ganz so, als wàre das Ende des
Schleifen-Blocks erreicht worden, wàhrend "redo" die Schleifen-
bedingung nicht auswertet. Man könnte auch sagen, "redo" springt
an den Anfang der Schleife *innerhalb* der geschweiften Klammer,
"next" springt zum Ende (auch *innerhalb* der Klammer).

Ein Beispiel, an dem der Unterschied deutlich wird:

my $c = 0;
while( $c++ < 5 )
{
next if( $c == 2 ); # Springt zum while und vergleicht "$c++ < 4"
print $c . "";
}

Das gibt auf der Kommandozeile "134" aus, denn wenn $c gleich 2 ist
wird an den Kopf der Schleife gesprungen und die Bedingung geprüft,
wodurch $c gleich wieder inkrementiert wird.

Ersetzt du das "next" durch "redo" bekommst du eine Endlosschleife,
denn wenn $c gleich 2 wird, dann wird zum Anfang der Schleife
gesprungen, die Bedingung wird aber nicht ausgeführt, $c ist immer
noch 2 und es wird wieder zum Anfang der Schleife gesprungen...

In der Praxis wird redo allerdings wenig verwendet, am ehesten trifft
man es dort, wo stackbasierte alte Programme nach Perl transferiert
wurden, oder wo explizit auf Performanz optimiert wurde. Grundsàtzlich
kann man aber alles was man mit redo macht auch durch geeignete
if-Abfragen oder verschachtelte while-Schleifen erreichen. Ein Vorteil
von redo ist, dass man sich dadurch oft einen zusàtzlichen Block spart,
was bei hàufig ausgeführtem Code dann merklich performanter sein kann,
weil Perl für den eingesparten Codeblock keinen eigenen Scope anlegen
muss.

next dagegen ist ist ziemlich hàufig anzutreffen. Gerade in Schleifen
mit viel Code ist es viel übersichtlicher, an einem Punkt zu sagen
"OK, die Arbeit ist für diesen Durchlauf getan, macht mit dem nàchsten
weiter" anstatt diverse if/else-Zweige zu verschachteln.

Ähnliche fragen