Regular-Expression

為什麼 perl 的 if 條件滿足空字元串?

  • November 18, 2020

下面的程式碼工作正常,除了 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$/ior 或/^[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不區分大小寫。

引用自:https://unix.stackexchange.com/questions/620212