2008-11-19 18 views
244

estoy tratando de utilizar una declaración breakfor en un bucle, pero como yo también estoy usando submarinos estrictas en mi código Perl, estoy recibiendo un error que dice:¿Cómo salgo de un bucle en Perl?

"ruptura"

Bareword no permitido mientras "subs estricta" en uso en ./final.pl línea 154.

¿hay una solución para esto (además de la desactivación submarinos estrictas)?

Mi código tiene el siguiente formato:

for my $entry (@array){ 
    if ($string eq "text"){ 
     break; 
    } 
} 
+17

Y si no tenía "terminados suscriptos" activados, habría obtenido un error de tiempo de ejecución en su lugar cuando no pudo encontrar un subnombre denominado "break". –

Respuesta

357

Oh, lo encontré. Usted utilizar last en lugar de break

for my $entry (@array){ 
    if ($string eq "text"){ 
     last; 
    } 
} 
+0

Aunque esto no es más que una diferencia semántica y no equivale a mucho más que la coherencia textual con el comando "siguiente". –

+0

sin mencionar que 'break' es una palabra clave experimental en> 5.010 ¿verdad? por lo tanto, es posible que obtenga un error de bloque externo dado, no que deba usarlo. La única forma de que funcione es si usaste un ciclo while dentro de un bloque determinado, y luego lo rompes, lo que en teoría funcionaría de la manera que quisieras IF (y solo si) el bloque dado solo tenía el ciclo while en él, y suponiendo que solo estuvieras alimentando dada alguna variable escalar ... pero ¿por qué hacer todo eso solo para usar un descanso, es (muy) mala forma, sin mencionar (blah!) solo decir, es "posible" simplemente no es bueno idea y no lo que usted puede pensar es – osirisgothra

+11

por alguna razón, no puedo recordar esta palabra clave 'último'. siempre termina buscando en Google 'perl break loop' :( – Thupten

161

datos adicionales (en caso de tener más preguntas):

FOO: { 
     for my $i (@listone){ 
      for my $j (@listtwo){ 
       if (cond($i,$j)){ 

        last FOO; # ---> 
            # | 
       }     # | 
      }      # | 
     }       # | 
} # <------------------------------- 
+2

En realidad, no necesita las llaves después de FOO: – cjm

+11

Lo hace si tiene otro código justo después del de mi bucle $ i que también desea omitir. es un bloque desnudo, que es en sí mismo un tipo de bucle gracioso que puede ser el último/rehacer/siguiente. – ysth

3

En una gran iteración me gusta usar las interrupciones. Sólo tiene que pulsar Ctrl + C para dejar de fumar:

my $exitflag = 0; 
$SIG{INT} = sub { $exitflag=1 }; 

while(!$exitflag) { 
    # Do your stuff 
} 
+0

Eso está bien, no tenía el encabezado de $ SIG {INT} antes –

+0

Sugerencia muy útil de hecho. +1 – Keve

11

Simplemente last funcionaría aquí:

for my $entry (@array){ 
    if ($string eq "text"){ 
     last; 
    } 
} 

Si ha anidado bucles, entonces last saldrá desde la más interna. Utilice etiquetas en este caso:

LBL_SCORE: { 
     for my $entry1 (@array1){ 
      for my $entry2 (@array2){ 
       if ($entry1 eq $entry2){ # or any condition 
        last LBL_SCORE; 
       } 
      } 
     } 
} 

Dada last declaración hará que el compilador para salir tanto de los bucles. Lo mismo se puede hacer en cualquier número de bucles, y las etiquetas se pueden arreglar en cualquier lugar.

Cuestiones relacionadas