아래 코드는 STDIN도 null 값을 취하고 첫 번째 선택된 섹션으로 이동한다는 점을 제외하면 잘 작동합니다 "print "Selected Y \n";"
. && $check ne "" ) {
after를 사용하면 /^[Y]?$/i
빈 STDIN 문제도 해결됩니다. 그러나 문제는 왜 거기에 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]?$/i
. Y
효과는 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