我有一个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;
}
}
}那么如何在这个程序中恢复一个子例程呢?
发布于 2009-09-29 07:04:16
要在Perl中递归调用子例程,只需从其本身调用子例程,就像在任何其他语言中一样:
sub factorial {
my $num = shift;
return 1 if $num < 2;
return $num * factorial($num - 1);
}然而,并不想使用递归来执行“重复直到条件改变”的场景。
这就是while 循环对的意义
my $valid;
while (!$valid) {
print "Enter something: ";
my $data = <STDIN>;
$valid = validate($data);
print "Bzzt! Invalid - try again!\n" unless $valid;
}发布于 2009-09-29 07:03:55
没有理由对此使用递归。一个简单的while循环就可以了。
my $input_valid = 0;
while( !$input_valid ) {
print "Enter some input: ";
my $input = <STDIN>;
$input_valid = validate_input( $input );
}如果validate_input返回0,则循环将重复。
发布于 2009-09-29 08:44:51
调用例程的正确方法是
goto &some_routine;...because您所拥有的是一个尾部调用--这是您在函数中所做的最后一件事。如果您通常调用它,则每个调用都会吃一个堆栈帧,并且内存分配会增加。就像这样,您重复使用相同的堆栈框架。从您作为程序员的角度来看,这与
return some_routine(@_);但却不吃记忆。
这只适用于那些自称自己是最后一件事的例程--在其他情况下,您确实应该切换到其他人建议的while循环(而且,为了代码的吸引力,您可能无论如何都想这样做)。
https://stackoverflow.com/questions/1490971
复制相似问题