为什么perl的if条件满足空字符串?

为什么perl的if条件满足空字符串?

下面的代码工作正常,除了 STDIN 也采用空值并转到第一个选择的部分之外"print "Selected Y \n";"。如果我使用&& $check ne "" ) {after /^[Y]?$/i,空 STDIN 的问题也会解决。但问题是为什么空值会传递到那里?

    my $check = 'NULL';
    while ( $check eq 'NULL' ) {
       print "Do you wish to continue? (Y/N)\n\n";
       print "Enter Selection: ";
       chomp ( $check = <STDIN> );
       if ( $check =~ /^[Y]?$/i ) { 
          print "Selected Y \n";
       }
       elsif ( $check =~ /^[N]$/i ) {
          print "Selected N \n";
       }
       else {
          print "\nInvalid input, please re-enter selection. (Y/N) \n\n";
          $check = 'NULL';
       }
   

我是 Perl 新手,有人可以帮助我理解这种行为吗?

答案1

Perl 正则表达式不区分大小写地/^[Y]?$/i匹配可选字符。Y影响?[Y]因为它允许[Y]匹配一个或零个字符。这意味着整个正则表达式也匹配空字符串。

[Y]与 just相同Y。如果您使用[Yy],它将匹配大写或小写y字符。在这种情况下,由于您/i习惯于不区分大小写,因此使用/^Y$/i.测试也是如此N,使用/^N$/i/^[Nn]$/

对于正确的输入循环,请执行类似的操作

while (1) {
        print 'Do you wish to continue (Y/N): ';
        my $reply = <STDIN>;

        if ($reply =~ /^Y/i) { last }
        if ($reply =~ /^N/i) { print "Bye!\n"; exit }

        print "Sorry, try again\n";
}

print "Continuing...\n"

这接受用户以 或 开头的任何响应ny不区分大小写。

相关内容