2011-10-17 40 views
0

如何使脚本非常具有交互性?Perl重新提示用户输入,直到获得准确的预期输入

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

验证:

  1. 只接受数字,没有字符,小数,特殊字符。
  2. 在用户输入奇数之前不会结束脚本。

以下代码正常工作;它遵循验证点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__ 

回答

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; 
    } 
} 
+0

假设用户在执行脚本时传递参数。在我的审判中会发生什么,只是提示闪烁。程序不能继续执行。 –

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

......然后立即离开它。 https://rt.cpan.org/Dist/Display.html?Name=IO-Prompt – ikegami

1
my $val; 
for (;;) { 
    print "Some prompt: "; 
    $val = <STDIN>; 
    chomp $val; 
    last if is_valid($val); 
    print "Bad input. Valid inputs are ...\n"; 
} 
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"; 
相关问题