2010-04-29 23 views
15

que estaba buscando a través de un código de compañeros desarrolladores cuando vi esto ..¿Qué significa para (;;) en Perl?

for (;;){ 
    .... 
    .... 
    .... 
} 

nunca he visto ";;" usado en un bucle ¿Qué hace esto exactamente?

+8

fyi, esta estructura no es exclusiva de perl; Apostaría a la mayoría de los idiomas con un soporte de estructura for (initialize; test; update) {} con cualquiera de esos campos vacíos. – Carl

+1

Una pregunta más útil para buscar sería "¿Qué hace para (;;) do" –

+0

Pregunta de programación elemental !!! ¿Cómo es que obtuvo tantos votos y puntos de vista? – Viet

Respuesta

27

Se repite para siempre. ';;' equivale a ningún valor de inicio, ninguna condición de detención y ninguna condición de incremento.

Es equivalente a

while (true) 
{ 
    ... 
} 

Hay por lo general sería un condicional break; declaración en alguna parte del cuerpo del bucle a menos que sea algo así como un sistema de circuito en reposo o suministro de mensajes.

+0

¡Impresionante! Gracias Mitch! Ahora que lo veo como "bucles para siempre debido a que no hay parámetros especificados", tiene mucho sentido. –

+3

La nota sobre bucles infinitos en "Learning Perl" señala que aunque la forma for es la idiomática en Perl es la forma while (se recomiendan mientras (1)). – HerbN

+3

@Ben: si te gustó eso, mira el operador '->', como en 'while ($ x -> 0) {...} '. – Ether

2

Infinite Loop (hasta que salga de él).

A menudo se utiliza en lugar de:

while(true) { // Do something } 
+1

Suena como una mala idea para usar en lugar de 'while (true) {...}'. Solo confunde noobs. –

+3

Para aquellos de nosotros que venimos de C++ usando VS, mientras que (verdadero) lanza una advertencia al compilar, pero para (;;) no. Los proyectos que ejecutan 0 advertencias de compilador se fuerzan a usar para (;;) y se transfieren al cambiar de idioma. – tloach

+0

0 advertencias? ¡Maldita sea! –

10

las 3 partes son opcionales. Una inicialización y actualización de bucle vacío es un noop. Una condición de terminación vacía es implícita true. Es esencialmente lo mismo que

while (true) { 
    //... 
} 

Tenga en cuenta que no tiene que ser todo o nada; puedes tener una parte y no otras.

for (init; cond;) { 
    //... 
} 

for (; cond; update) { 
    //... 
} 

for (init; ; update) { 
    //... 
} 
4

Infinite loop. Gran parte del tiempo se usará en un hilo para hacer algo de trabajo.

boolean exit = false; 

    for(;;) { 
     if(exit) { 
      break; 
     } 
     // do some work 
    } 
2

Es la misma que

while(true) { 
    ... 
} 

mismo enlaza siempre.

No necesita especificar todas las partes de un bucle for. Por ejemplo el siguiente bucle (que no contiene ningún cuerpo, o de la ficha de actualización) llevará a cabo una búsqueda lineal de myArray

for($index = -1; $myArray[++$index] != $target;); 
4

Al igual que en C, el bucle for tiene tres secciones:

  • un pre- sección de bucle, que se ejecuta antes de que comience el bucle.
  • una sección de condición continua que, aunque es verdadera, mantendrá el ciclo en funcionamiento.
  • una sección de post-iteración que se ejecuta después de cada iteración del cuerpo del bucle.

Por ejemplo:

for (i = 1, acc = 0; i <= 10; i++) 
    acc += i; 

se suman los números de 1 a 10 inclusive (en C y, suponiendo que utiliza una sintaxis Perl como $i y tirantes, en Perl también).

Sin embargo, nada requiere que las secciones realmente contengan nada y, si la condición falta, se supone que es verdadera.

Por lo tanto, el bucle for(;;) básicamente significa: no realice ninguna configuración de bucle, realice bucles para siempre (no obstante, se rompa) y no realice ningún procesamiento específico de iteración. En otras palabras, es un ciclo infinito.