Regular-Expression
為什麼 perl 的 if 條件滿足空字元串?
下面的程式碼工作正常,除了 STDIN 也採用空值並轉到 first selection 的部分
"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 的新手,有人可以幫我理解這種行為嗎?
Perl 正則表達式不區分大小寫
/^[Y]?$/i
地匹配可選字元。影響Y
它允許匹配一個或零個字元。這意味著整個正則表達式也匹配空字元串。?``[Y]``[Y]
與
[Y]
just 相同Y
。如果您使用[Yy]
,它將匹配大寫或小寫y
字元。在這種情況下,由於您使用/i
不區分大小寫,因此使用/^Y$/i
. 測試也是如此N
,使用/^N$/i
or 或/^[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
這接受使用者以or開頭的任何響應,y
不區分大小寫。