首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Perl中输入无效输入时,如何要求用户重新输入输入?

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

Stack Overflow用户
提问于 2009-09-29 06:51:42
回答 9查看 3.3K关注 0票数 3

我有一个Perl子程序,它要求用户输入。我在该子程序本身内执行检查,输入的输入是否为有效输入。

如果不是,我想再次调用子例程,让用户输入一个有效的输入。

我的子程序如下所示:

代码语言:javascript
复制
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;
        }
    }
}

那么如何在这个程序中恢复一个子例程呢?

EN

回答 9

Stack Overflow用户

发布于 2009-09-29 07:04:16

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

代码语言:javascript
复制
sub factorial {
  my $num = shift;
  return 1 if $num < 2;
  return $num * factorial($num - 1);
}

然而,并不想使用递归来执行“重复直到条件改变”的场景。

这就是while 循环对的意义

代码语言:javascript
复制
my $valid;
while (!$valid) {
  print "Enter something: ";
  my $data = <STDIN>;
  $valid = validate($data);
  print "Bzzt!  Invalid - try again!\n" unless $valid;
}
票数 10
EN

Stack Overflow用户

发布于 2009-09-29 07:03:55

没有理由对此使用递归。一个简单的while循环就可以了。

代码语言:javascript
复制
my $input_valid = 0;
while( !$input_valid ) { 
    print "Enter some input: ";
    my $input = <STDIN>;
    $input_valid = validate_input( $input );
}

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

票数 7
EN

Stack Overflow用户

发布于 2009-09-29 08:44:51

调用例程的正确方法是

代码语言:javascript
复制
goto &some_routine;

...because您所拥有的是一个尾部调用--这是您在函数中所做的最后一件事。如果您通常调用它,则每个调用都会吃一个堆栈帧,并且内存分配会增加。就像这样,您重复使用相同的堆栈框架。从您作为程序员的角度来看,这与

代码语言:javascript
复制
return some_routine(@_);

但却不吃记忆。

这只适用于那些自称自己是最后一件事的例程--在其他情况下,您确实应该切换到其他人建议的while循环(而且,为了代码的吸引力,您可能无论如何都想这样做)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1490971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档