Frage

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

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

, und ich bin ziemlich sicher, will er bis zum Ende der Schleife gehen, aber es ist eigentlich das aktuelle Unterprogramm austritt, so dass ich zu jeder Änderung muß die last oder die ganze Schleife Refactoring, wenn es eine bessere Art und Weise, dass jemand kann empfehlen.

War es hilfreich?

Lösung

do BLOCK while (EXPR) ist lustig in dem tun ist nicht wirklich eine Schleifenstruktur. Also, zuletzt, als nächster, und Redo soll dort nicht verwendet werden. Befreien Sie sich von der letzten und stellen Sie die EXPR falsch zu bewerten, wenn diese Situation gefunden wird. Auch auf strenge, der euch geben sollte zumindest eine Warnung hier.

Andere Tipps

Wickeln Sie das tun "Schleife" in einem kahlen Block (die is eine Schleife):

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

Dies funktioniert für letzte und Redo, aber nicht weiter; für diesen Ort der nackten Block innerhalb des do-Block:

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

nie ein Fan von do / while-Schleifen in Perl. die do ist nicht wirklich eine Schleife, die warum last ist, wird es nicht ausbrechen. In unserem alten Pascal betäuben Sie nicht eine Schleife in der Mitte verlassen konnten, weil das wäre falsch nach dem Weisen Niklaus „Ein Eingang / Ausgang eines“ Wirth. Deshalb mussten wir einen Exit-Flag erstellen. In Perl würde es wie folgt aussehen:

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

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

Warum nicht einfach eine while-Schleife verwenden?

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

Sie müssen möglicherweise Ihre Logik ändern leicht die Tatsache anzupassen, dass Ihr Test am Anfang statt Ende der Schleife, aber das sollte trivial sein.

Übrigens, man kann tatsächlich von einer Pascal Schleife ausbricht, wenn Sie Delphi verwenden und Delphi DID fangen an für eine kleine Weile, bis Microsoft wised und kam mit den .NET-Sprachen aus.

@ "http://perldoc.perl.org/functions/last.html": zuletzt kann ein Block, dass die Renditen ein Wert wie eval zu beenden {}, sub {} oder {} tun nicht verwendet werden, und sollte nicht verwendet werden ein grep () oder Karte () Operation zu beenden.

Verwenden Sie dazu einen boolean im 'while ()' und legen Sie es in dem Sie haben 'last' ...

spät zum Party - Ich habe vor kurzem mit for(;;) worden Messing. In meinem rudimentären Tests für bedingte Ausdrücke A und B, was Sie tun möchten, mit:

do {
    last if A;
} while(B);

kann als erreicht werden:

for(;; B || last) {
    last if A;
}

Ein bisschen hässlich, aber vielleicht nicht mehr so ??als die anderen Abhilfen :). Ein Beispiel:

my $i=1; 
for(;; $i<=3 || last) { 
    print "$i ";
    ++$i;
}

Ausgänge 1 2 3. Und Sie können die Schrittweite kombinieren, wenn Sie wollen:

my $i=1;
for(;; ++$i, $i<=3 || last) { 
    print "$i ";
}

(mit ||, weil es hat eine höhere Priorität als ,)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top