Domanda

Secondo il manuale per perl per last ( http://perldoc.perl.org/functions /last.html ), last non può essere utilizzato per uscire da loops do {}, ma non menziona un'alternativa. Lo script sto mantenendo ha questa struttura:

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

e sono abbastanza sicuro che vuole andare alla fine del ciclo, ma la sua realtà esce dalla subroutine corrente, quindi ho bisogno di entrambi i cambiamenti del last o refactoring l'intero ciclo se c'è un modo migliore che qualcuno possa raccomandare.

È stato utile?

Soluzione

do BLOCK while (EXPR) è divertente in che non è davvero una struttura ad anello. Così, lo scorso, next e redo non dovrebbero essere utilizzati lì. Sbarazzarsi degli ultimi e regolare l'ESPR per valutare falso quando viene trovato quella situazione. Inoltre, accendere rigorosa, che dovrebbe dare almeno un avvertimento qui.

Altri suggerimenti

Avvolgere il fare "loop" in un blocco nudo (che è un anello):

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

Questo funziona per ultimo e rifare, ma non il prossimo; per quel luogo il blocco nuda all'interno del blocco do:

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

Non un fan di do / while in Perl. il do non è davvero un ciclo che è il motivo last non si romperà fuori di esso. Nel nostro vecchio Pascal stordimento non si poteva uscire da un ciclo in mezzo perché che sarebbe sbagliato in base al saggio Niklaus "Un ingresso / uscita una" Wirth. Pertanto, abbiamo dovuto creare una bandiera di uscita. In Perl che sarebbe sembrare qualcosa di simile:

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

Ora, si può vedere mentre Pascal mai preso piede.

Perché non basta usare un ciclo while?

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

Potrebbe essere necessario cambiare leggermente la logica per ospitare il fatto che il test è all'inizio, invece di fine del ciclo, ma che dovrebbe essere banale.

Tra l'altro, in realtà si può uscire da un loop Pascal se si sta utilizzando Delphi e Delphi ha interferito sopra per un po 'fino a quando Microsoft rinsavisce ed è venuto fuori con i linguaggi .NET.

  

@ "http://perldoc.perl.org/functions/last.html":   ultima non può essere utilizzato per uscire da un blocco che restituisce un valore, come eval {}, {} sub o fare {}, e non dovrebbe essere utilizzato per uscire da un grep () o map () operazione.

Quindi, utilizzare un valore booleano nel 'while ()' e impostarlo in cui si dispone di 'ultima' ...

in ritardo alla festa - mi è stato scherzi con for(;;) di recente. Nel mio test rudimentale, per le espressioni condizionali A e B, ciò che si vuole fare con:

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

può essere realizzato come:

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

un po 'brutto, ma forse non di più rispetto alle altre soluzioni alternative :). Un esempio:

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

Uscite 1 2 3. E si può coniugare l'incremento, se si desidera:

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

(usando || perché ha la precedenza maggiore di ,)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top