Повторно запустить итерацию цикла - PullRequest
5 голосов
/ 14 декабря 2011

У меня есть эта программа, которая принимает массив слов и просит пользователя ввести предложение, содержащее каждое слово из массива:

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

Если пользователь вводит ввод со словом, онработает отлично.Но если он этого не делает, он только печатает сообщение об ошибке и переходит к следующему слову.Я хочу, чтобы он побуждал пользователя повторно вводить вводы для того же слова.Но как ?Я попробовал дальше, это не сработало.

Ответы [ 3 ]

18 голосов
/ 14 декабря 2011

Вы можете использовать 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;
        }
}
3 голосов
/ 15 декабря 2011

Хотя 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 не требуется.

3 голосов
/ 15 декабря 2011

Я бы создал бесконечный цикл 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";
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...