在Perl中,如何在用户输入无效输入时要求用户重新输入输入?

sta*_*NCT 3 recursion perl subroutine

我有一个Perl子程序,它要求用户输入.无论输入的输入是否为有效输入,我都会在子程序内部执行检查.

如果不是,我想再次调用子程序让用户输入有效输入.

我的子程序如下:

sub some_routine {    
    print "Enter a number to select   (1) Apple (2) Mango (3) grapes:"
    $value=STDIN;
    if($value =~ /[^1-3]/ ) {
        print "The input is not valid!";
        print "Do you want to continue selecting a fruit again (Y or N)?";
        $choice = STDIN;
        if( $choice eq "y") {
            ### I want to call the subroutine again to enter input ###
          } else {
            exit;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

那么如何递归子程序呢?

Dav*_*man 10

要在Perl中递归调用子例程,只需从自身调用sub,就像在任何其他语言中一样:

sub factorial {
  my $num = shift;
  return 1 if $num < 2;
  return $num * factorial($num - 1);
}
Run Code Online (Sandbox Code Playgroud)

但是,您实际上并不想使用递归来"重复直到条件更改"方案.
这是while循环的用途
:

my $valid;
while (!$valid) {
  print "Enter something: ";
  my $data = <STDIN>;
  $valid = validate($data);
  print "Bzzt!  Invalid - try again!\n" unless $valid;
}
Run Code Online (Sandbox Code Playgroud)

  • *TMTOWTDI,BMOTWAW.*不止一种方法可以做到这一点,但大多数方法都是错误的. (4认同)
  • @Jurily:有不止一种方法可以做到这一点,但这并不意味着它们对所有情况都同样有益. (2认同)

fri*_*edo 7

这没有理由使用递归.一个简单的while循环就行了.

my $input_valid = 0;
while( !$input_valid ) { 
    print "Enter some input: ";
    my $input = <STDIN>;
    $input_valid = validate_input( $input );
}
Run Code Online (Sandbox Code Playgroud)

如果validate_input返回0,则循环将重复.