2010-12-06 8 views
7

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

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 de corriente, por lo que necesita ya sea cambiar el last o refactorizar todo el ciclo si hay una forma mejor que alguien pueda recomendar.

+0

La alternativa es no usar 'do {}'. –

Respuesta

10

do BLOCK while (EXPR) es divertido en el que hacer no es realmente una estructura de bucle. Entonces, el último, el siguiente y el rehacer no se deben usar allí. Deshágase de la última y ajuste la EXPR para evaluar falsa cuando se encuentre esa situación. Además, active strict, lo que debería darle al menos una advertencia aquí.

+2

+1: Do no es un bucle. –

1

@ "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 do {}, y no debe usarse para salir de una operación grep() o map().

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

16

Wrap el do "bucle" en un bloque al descubierto (que es un bucle):

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

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

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

Elegante. +1. ... – DVK

+3

Esto se menciona en [perlsyn] (http://perldoc.perl.org/perlsyn.html#Statement- Modificadores), aunque creo que es más claro si utiliza una etiqueta en su bloque desnudo y en su 'último 'declaración. – cjm

+4

¡Siempre lo supe, Perl es un lenguaje enfermo!do-while-loops en realidad no son bucles, pero los bloques desnudos son bucles :: facepalm :: De todos modos, me gusta Perl, no obstante, ya que es tan maravillosamente hacky y puedes resolver problemas complejos de forma rápida y sucia, "muy sucia" ;-) +1 para tu solución – Mecki

2

Nunca un fan de do/while loops en Perl. el do no es realmente un bucle por lo que last no saldrá de él. En nuestra antigua Pascal aturdimiento no se podía salir de un bucle en el medio porque que sería incorrecto según el sabio 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, puedes ver mientras Pascal nunca se prendió.

+0

Pascal no era tan malo en lo que respecta a la enseñanza de idiomas :) Pero estoy tan contenta de nunca tener que mirar (o cielos escribir a la fuerza) otra línea del código Pascal nunca más. – DVK

+0

Si solo esta y otras cosas podrían haber impedido que VBscript se pusiera al día. – cikkle

+1

+1 por mención de Pascal. Tan raro en estos días. :-) – mswanberg

1

¿Por qué no utilizar un bucle while?

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

Puede que tenga que cambiar su lógica ligeramente para acomodar el hecho de que su prueba es al principio en vez del final de su ciclo, pero que debería ser trivial.

Por cierto, usted PUEDE salir de un bucle Pascal si está utilizando Delphi, y Delphi DID se encendió por un tiempo hasta que Microsoft se preparó y salió con los idiomas .net.