2011-12-14 12 views
5

ho questo programma che prende un array di parole e chiede all'utente di digitare una frase che ha ciascuna parola dall'array:Rieseguire un'iterazione del ciclo

@words = qw(Hi world thanks); 
foreach $word (@words) 
{ 
     print "Enter a line with word:$word\n"; 
     chomp($input = <STDIN>); 
     if($input=~/$word/i) 
     { 
       print "Great\n"; 
     } else { 
       print "Incorrect. Type a line containing $word\n"; 
     } 
} 

Se l'utente digita un ingresso con la parola, funziona bene. Ma se non lo fa Stampa solo il messaggio di errore e passa alla parola successiva. Lo voglio chiede all'utente di reinserire gli input per la stessa parola. Ma come ? Ho provato dopo non ha funzionato.

risposta

18

È possibile utilizzare un redo in questo caso su riavviare l'iterazione corrente.

foreach my $word (@words) 
{ 
     print "Enter a line with word:$word\n"; 
     chomp($input = <STDIN>); 
     if($input=~/$word/i) 
     { 
       print "Great\n"; 
     } else { 
       print "Incorrect. Type a line contaning $word\n"; 
       redo; # restart current iteration. 
     } 
} 

Un'alternativa meno consigliato è quello di utilizzare un goto:

foreach my $word (@words) 
{ 
     INPUT:print "Enter a line with word:$word\n"; 
     chomp($input = <STDIN>); 
     if($input=~/$word/i) 
     { 
       print "Great\n"; 
     } else { 
       print "Incorrect. Type a line contaning $word\n"; 
       goto INPUT; 
     } 
} 
+1

Grazie. Funziona. Perl era così tanti modi di fare le cose. –

+0

Voterò per 'redo'. –

+2

Holy cow, 14 upvotes per 'redo'? Molto tempo da quando ho visto un tale successo travolgente nel tag perl. – TLP

3

vorrei creare un infinito while ciclo per uscire fuori:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my @words = qw(Hi world thanks); 
foreach my $word (@words) { 
    print "Enter a line with word: $word\n"; 
    while (1) { 
    chomp(my $input = <STDIN>); 
    if($input=~/$word/i) { 
     print "Great\n"; 
     last; 
    } else { 
     print "Incorrect. Type a line contaning $word\n"; 
    } 
    } 
} 

ovviamente mi sarebbe probabilmente separata la logica di ogni singola parola in un sottotitolo, quindi si sovrappone a quello:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my @words = qw(Hi world thanks); 
get_word($_) for @words; 

sub get_word { 
    my $word = shift or die "Need a word"; 
    print "Enter a line with word: $word\n"; 
    while (1) { 
    chomp(my $input = <STDIN>); 
    if($input=~/$word/i) { 
     print "Great\n"; 
     last; 
    } else { 
     print "Incorrect. Type a line contaning $word\n"; 
    } 
    } 
} 
3

Mentre redo è decisamente più cuter, ecco una versione con while ... continue. Si basa su un ciclo interno che viene abbandonato solo quando viene inserita la parola corretta e stampa una correzione per ogni risposta errata.

use strict; 
use warnings; 

my @words = qw(Hi world thanks); 
foreach my $word (@words) { 
    print "Enter a line with word: $word\n"; 
    while (my $input = <>) { 
     last if $input =~ /$word/; 
    } continue { 
     print "Incorrect. Type a line contaning $word\n"; 
    } 
    print "Great\n"; 
} 

Nota che chomp non è necessaria in questo caso.

+0

Immagino che 'chomp' non sia realmente necessario in nessuno di questi, ma solo perché la regex non è ancorata, e non è un confronto 'eq'. –

+0

@JoelBerger Quindi "in questo caso". – TLP

+0

oh, pensavo che intendessi nel tuo caso. Gotcha –

Problemi correlati