![为什么perl的if条件满足空字符串?](https://linux22.com/image/183567/%E4%B8%BA%E4%BB%80%E4%B9%88perl%E7%9A%84if%E6%9D%A1%E4%BB%B6%E6%BB%A1%E8%B6%B3%E7%A9%BA%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
下面的代码工作正常,除了 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"
这接受用户以 或 开头的任何响应n
,y
不区分大小写。