2010-04-29 14 views
15

Cercavo però un codice colleghi sviluppatori quando ho visto questo ..Cosa significa per (;;) in Perl?

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

Non ho mai visto ";;" usato in un ciclo. Cosa fa esattamente questo?

+8

fyi, questa struttura non è univoca di perl; Scommetterei la maggior parte delle lingue con un supporto per la struttura (initialize; test; update) {} che ha uno di questi campi vuoto. – Carl

+1

Una domanda più utile per la ricerca sarebbe "Cosa fa per (;;) do" –

+0

Domanda di programmazione elementare !!! Come mai ha ottenuto così tanti voti e opinioni ?! – Viet

risposta

27

Si avvicina per sempre. ';;' equivale a nessun valore iniziale, nessuna condizione di arresto e nessuna condizione di incremento.

È equivalente a

while (true) 
{ 
    ... 
} 

ci sarà di norma un condizionale break; dichiarazione da qualche parte nel corpo del ciclo meno che non sia qualcosa di simile a un sistema a circuito inattivo o message pump.

+0

Impressionante! Grazie Mitch! Ora che lo vedo come "loop per sempre a causa di parametri non specificati" ha perfettamente senso. –

+3

La nota sui loop infiniti in "Learning Perl" nota che sebbene la forma for sia quella idiomatica in Perl è la forma while (raccomandano mentre (1)). – HerbN

+3

@Ben: se ti è piaciuto, controlla l'operatore '->', come in 'while ($ x -> 0) {...}'. – Ether

2

Infinite Loop (fino a quando non si esce da esso).

è spesso usato al posto di:

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

Sembra una cattiva idea da usare invece di 'while (true) {...}'. Confonde solo noobs. –

+3

Per quelli di noi che vengono dal C++ usando VS, mentre (true) lancia un avvertimento durante la compilazione ma per (;;) no. I progetti che eseguono 0 avvisi del compilatore sono obbligati a utilizzare per (;;) e vengono trasferiti quando si cambiano le lingue. – tloach

+0

0 avvertimenti? Dannazione! –

10

Tutti e 3 le parti sono opzionali. L'inizializzazione e l'aggiornamento di un ciclo vuoto sono noop. Una condizione di terminazione vuota è implicita true. È praticamente lo stesso di

while (true) { 
    //... 
} 

Si noti che non è necessario essere tutto o niente; puoi avere una parte e non altre.

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

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

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

Ciclo infinito. Un sacco di volte sarà usato in una discussione per fare un po 'di lavoro.

boolean exit = false; 

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

E 'lo stesso di

while(true) { 
    ... 
} 

E loop per sempre.

Non è necessario specificare tutte le parti di un ciclo for. Ad esempio, il seguente ciclo (che non contiene il corpo, o l'aggiornamento token) eseguirà una ricerca lineare di myArray

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

Proprio come in C, il ciclo for ha tre sezioni:

  • un pre- sezione di loop, che viene eseguita prima dell'avvio del loop.
  • una sezione di condizione continua che, se è vera, manterrà il ciclo in corso.
  • una sezione di post-iterazione che viene eseguita dopo ogni iterazione del corpo del loop.

Ad esempio:

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

si sommano i numeri da 1 a 10 incluso (in C e, a patto di utilizzare la sintassi Perl come $i e bretelle, in Perl pure).

Tuttavia, nulla richiede che le sezioni effettivamente contengano nulla e, se la condizione è mancante, si presume che sia vera.

Quindi il ciclo for(;;) significa semplicemente: non eseguire alcuna configurazione di loop, loop per sempre (interruzioni in deroga) e non eseguire alcuna elaborazione specifica dell'iterazione. In altre parole, è un ciclo infinito.