2011-12-14 16 views
5

言葉、それはうまく動作します。しかし、彼がしない場合は、それはエラーメッセージを印刷し、次の単語に移動します。私はそれが同じ単語の入力を再入力するようにユーザーに促したい。しかしどうですか?私は次にそれを試みたがうまくいかなかった。再実行ループ反復

答えて

18

この場合は、redoを使用して、を再起動することができます。

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. 
     } 
} 

あまり推奨代替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

ありがとうございました。できます。 perlはたくさんのことをやっていました。 –

+0

私は 'redo'に投票します。 –

+2

聖なる牛、 'redo'のための14 upvotes?私はperlタグで圧倒的な評価を見て以来、長い時間。 – TLP

3

私は外に出るため、無限whileループ作成します。もちろん

#!/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"; 
    } 
    } 
} 

を私はおそらく分離う個々の単語の論理をサブにしてからループします:

#!/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

redoは間違いなくかわいいですが、ここにはwhile ... continueのバージョンがあります。正しい単語が入力されたときにだけ終了する内部ループに依存し、それぞれの誤った答えに対して訂正を印刷します。

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"; 
} 

この場合、chompは必須ではありません。

+0

私は 'chomp'は本当にこれらのどれにも必要ではないと思いますが、正規表現がアンカーされておらず、' eq'の比較ではないからです。 –

+0

@JoelBergerしたがって "この場合"。 – TLP

+0

ああ、私はあなたがあなたの場合に意味すると思った。 Gotcha –