Pregunta

De acuerdo con el manual de Perl para para last ( http://perldoc.perl.org/functions /last.html ), last no se puede utilizar para salir de bucles do {}, pero no menciona una alternativa. El guión que estoy manteniendo tiene esta estructura:

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

y estoy bastante seguro de que quiere ir hasta el final del bucle, pero en realidad es salir de la subrutina actual, por lo que necesito ya sea el cambio del last o refactorizar todo el bucle si hay una mejor manera de que alguien pueda recomendar.

¿Fue útil?

Solución

do BLOCK while (EXPR) es divertido en el que no es realmente una estructura de bucle. Por lo tanto, no se supone último, siguiente, y hacer de nuevo para ser utilizado allí. Deshacerse de la última y ajustar el EXPR para evaluar falsa cuando se encuentra esa situación. Además, encienda estricta, que debe dar por lo menos una advertencia aquí.

Otros consejos

Wrap la DO "bucle" en un bloque desnudo (que es a circular):

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

Esto funciona para pasado y rehacer, pero no al lado; para ese lugar el bloque desnudo dentro del bloque do:

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

Nunca fan de do / while bucles en Perl. la do no es realmente un bucle que es la razón por last no va a salir de ella. En nuestro viejo Pascal Daze no se podía salir de un bucle en el medio porque que sería un error de acuerdo con la salvia Niklaus "Una entrada / una salida" Wirth. Por lo tanto, tuvimos que crear una bandera de salida. En Perl se vería algo como esto:

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

Ahora, se puede ver, mientras que Pascal nunca se puso de moda.

¿Por qué no utilizar un bucle while?

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

Es posible que tenga que cambiar su lógica ligeramente para acomodar el hecho de que la prueba se encuentra al principio en lugar de final de su ciclo, pero que debe ser trivial.

Por cierto, en realidad se puede salir de un bucle de Pascal si está usando Delphi, Delphi y tuvo éxito por un tiempo hasta que Microsoft wised y salió con los lenguajes .NET.

@ "http://perldoc.perl.org/functions/last.html": última no se puede utilizar para salir de un bloque que devuelve un valor tal como eval {}, sub {} o hacer {}, y no debe ser utilizado para salir de una grep () o del mapa () operación.

Por lo tanto, utilice un valor lógico en el 'while ()' y configurarlo en el que tiene 'última' ...

tarde a la fiesta - He estado jugando con for(;;) recientemente. En mis pruebas rudimentaria, para las expresiones condicionales A y B, lo que quiere hacer con:

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

se puede lograr como:

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

Un poco feo, pero tal vez no más que las soluciones temporales :). Un ejemplo:

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

Salidas 1 2 3. Y puede combinar el incremento si quieres:

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

(usando || porque tiene mayor precedencia que ,)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top