Perlのif条件が空の文字列を満たすのはなぜですか?

Perlのif条件が空の文字列を満たすのはなぜですか?

以下のコードは、STDINもNULL値を取り、最初の選択したセクションに移動することを除いてうまく機能します"print "Selected Y \n";"&& $check ne "" ) {after を使用すると、空の/^[Y]?$/iSTDIN 問題も解決されます。しかし、問題はなぜそこにnull値が渡されるのかということです。

    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]?$/iY効果は、1つまたは0つの文字の一致を許可すること?です。これは、正規表現全体も空の文字列と一致することを意味します。[Y][Y]

[Y]ただのようです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

関連情報