2010-12-06 7 views
7

Nach dem Perl-Handbuch für last (http://perldoc.perl.org/functions/last.html), last nicht verwendet werden kann, aus do {} Schleifen zu brechen, aber es keine Alternative zu nennen. Die Skript ich beibehalten hat diese Struktur:Alternative zu „letzten“ in do-Schleife

do { 
    ... 
    if (...) 
    { 
     ... 
     last; 
    } 
} while (...); 

und ich bin mir ziemlich sicher, dass er bis zum Ende der Schleife gehen will, aber es ist eigentlich das aktuelle Unterprogramm austritt, so brauche ich, um entweder die last zu ändern oder refactor die ganze Schleife, wenn es eine bessere Möglichkeit gibt, die jemand empfehlen kann.

+0

Die Alternative ist, kein 'do {}' zu verwenden. –

Antwort

10

do BLOCK while (EXPR) lustig ist, dass nicht wirklich eine Schleifenstruktur ist. Also, last, next und redo sollen dort nicht verwendet werden. Beseitigen Sie die letzte und passen Sie die EXPR an, um den Wert false zu ermitteln, wenn diese Situation gefunden wird. Aktivieren Sie auch strict, was Ihnen hier zumindest eine Warnung geben sollte.

+2

+1: Do ist keine Schleife. –

1

@ "http://perldoc.perl.org/functions/last.html": zuletzt verwendet werden kann, nicht um einen Block zu beenden, die einen Wert zurückgibt, wie eval {}, {} oder sub Do {}, und sollte nicht verwendet werden, um eine Grep() - oder Map() -Operation zu beenden.

So verwenden Sie einen boolean in der 'while()' und es an dem Sie 'last' haben ...

16

Wickeln Sie die do "Schleife" in einem kahlen Block (die ist eine Schleife):

{ 
    do { 
     ... 
     if (...) 
     { 
      ... 
      last; 
     } 
    } while (...); 
} 

Dies funktioniert für letzte und Redo, aber nicht weiter; für diesen Platz der bloße Block in der Do-Block:

do {{ 
    ... 
    if (...) 
    { 
     ... 
     next; 
    } 
    ... 
}} while (...); 
+0

Elegant. +1. ... – DVK

+3

Dies wird in [perlsyn] (http://perldoc.perl.org/perlsyn.html#Statement-Modifiers) erwähnt, obwohl ich denke, dass es klarer ist, wenn Sie ein Etikett auf Ihrem leeren Block und in Ihrem 'last verwenden 'Aussage. – cjm

+4

Ich wusste es immer, Perl ist eine kranke Sprache!do-while-loops sind eigentlich keine loops sondern bloße blocks sind loops :: facepalm :: Wie auch immer, ich mag Perl trotzdem, da es so wunderbar hacky ist und man komplexe Probleme schnell und dreckig lösen kann, "sehr dreckig" ;-) +1 für Ihre Lösung. – Mecki

2

Nie ein Fan von Do/While-Schleifen in Perl. Die do ist nicht wirklich eine Schleife, weshalb last nicht ausbrechen wird. In unserer alten Pascal Benommenheit konnte man eine Schleife in der Mitte nicht verlassen, weil das wäre falsch nach dem weisen Niklaus "Ein Eingang/ein Ausgang" Wirth. Daher mussten wir eine Exit-Flagge erstellen. In Perl würde es in etwa so aussehen:

my $endFlag = 0; 
do { 
    ... 
    if (...) 
    { 
     ... 
     $endFlag = 1; 
    } 
} while ((...) and (not $endFlag)); 

Jetzt können Sie sehen, während Pascal auf nie erwischt.

+0

Pascal war nicht so schlecht, was das Unterrichten von Sprachen angeht :) Aber ich bin sooo froh, dass ich nie wieder eine andere Pascal-Code-Zeile ansehen (oder Himmel forbit schreiben) muss. – DVK

+0

Wenn nur diese und eine beliebige Anzahl anderer Dinge VBScript gestoppt haben könnten. – cikkle

+1

+1 für Pascal Erwähnung. So selten in diesen Tagen. :-) – mswanberg

1

Warum nicht einfach eine While-Schleife verwenden?

while (...) { 
    ... 
    if (...) { 
    last; 
    } 
} 

Sie haben vielleicht Ihre Logik etwas zu ändern, um die Tatsache zu berücksichtigen, die den Test bei der statt Ende der Schleife beginnt, aber das sollte trivial sein.

Übrigens, Sie können tatsächlich aus einer Pascal-Schleife ausbrechen, wenn Sie Delphi verwenden, und Delphi DID für eine Weile, bis Microsoft und die .net-Sprachen kam.