Perl重新提示用户输入,直到得到确切的预期输入

时间:2011-10-17 04:57:32

标签: perl

如何让脚本非常具有互动性?

剧本目的:
获取用户输入的号码并通过get_mod_val功能查找mod;如果它返回1然后说“好”并退出脚本;如果它返回0,则要求用户输入奇数。

验证:

  1. 只接受数字,不接受字符,小数,特殊字符。
  2. 在用户输入奇数之前不要结束脚本。
  3. 以下代码正常;它遵循上面的验证要点1规则,但根据我们的要求法,它不是非常互动。当上述规则失败时,脚本退出,我们需要再次执行脚本。

    我们如何使以下代码具有很强的互动性?

    $ip_no = $ARGV[0];
    if ($ip_no!="") {
    
        $get_mod_op = get_mod_val($ip_no);
        if ($ip_no =~ /\D/){
            print "Entered number only.....";
            exit;
        }else{
            if ($get_mod_op==1) {
                print "Good odd number(${get_mod_op}): ${ip_no} ";
                exit;
            }else{
                print "Good even number(${get_mod_op}): ${ip_no} ";
                exit;
            }
    
        }
    }else{
        print "Enter number.";
        exit;
    }
    

    感谢所有人,最后我已根据您的建议完成了代码,以下代码片段符合我的要求,审核代码并建议优化。

    if ($ARGV[0] != "") {
        $user_ip = $ARGV[0];
    }elsif (($ARGV[0] =~ /\D/ ) || ($ARGV[0] eq "") ){
         print "Enter odd number only: ";
         $user_ip = <STDIN>;
    }else{
        $user_ip = <STDIN>;
    }
    
    do{ #get mod value, if mod_off is 1 then entered number is odd otherwise ask user to enter the odd number
        $mod_off = find_mod_val($user_ip);
        if (($user_ip == "") || ($user_ip eq "") || ($user_ip eq "") || ($mod_off == 0)) {
            print "Enter odd number only: ";
            $user_ip = <STDIN>;
        }
    }until($mod_off == 1);
    
    print "Good odd number ${user_ip}";
    
    
    
    sub find_mod_val($user_ip){
        return $user_ip%2;
    }
    __END__
    

4 个答案:

答案 0 :(得分:2)

不要使用ARGV [0]并从STDIN读取(因此您需要运行脚本并键入所需的单词)。我重写了你的代码:

my $finish = 0;
while( ! $finish ) {
    print "Enter number.";
    my $ip_no = <STDIN>;
    chomp($ip_no);
    $get_mod_op = get_mod_val($ip_no);
    if( $ip_no =~ /\D/ ){
        print "Entered number only.....";
    }
    elsif( $get_mod_op == 1 ) {
        print "Good odd number(${get_mod_op}): ${ip_no} ";
        $finish = 1;
    } 
    else {
        print "Good even number(${get_mod_op}): ${ip_no} ";
        $finish = 1;
    }
}

答案 1 :(得分:2)

TIMTOWTDI,这次是递归!好处是您可以重用该函数来验证其他输入。我想你可以制作一个包裹循环的子,但来吧这很有趣!

sub get_input {
  my ($message, $valid) = @_;
  print "$message: ";
  chomp(my $response = <>);
  unless( $response =~ $valid ) {
    print "Invalid response!\n";
    $response = get_input($message, $valid);
  }
  return $response;
}

my $response = get_input("Enter a number", qr/^\d+$/);
print "Got: $response\n";

答案 2 :(得分:1)

  1. 你确定要它是互动的吗?这样做会使其在其他脚本中的用处更少。
  2. 如果必须,则将测试代码放入sub,然后使用sub验证$ARGV[0],如果失败,进入请求输入的循环并运行验证。
  3. 查看Perl IO::Prompt模块。

答案 3 :(得分:1)

my $val;
for (;;) {
   print "Some prompt: ";
   $val = <STDIN>;
   chomp $val;
   last if is_valid($val);
   print "Bad input. Valid inputs are ...\n";
}