
m//
Perl은 일치 연산자 내에서 변수 확장을 어떻게 수행합니까 ? 내가 읽은 것은 m//
변수 확장/보간이 한 번만 수행된다는 것입니다. 그런데 확장 Unmatched ( in regex
되면 왜 표시되나요 $pat
?
my $pat = '(\\)';
'\\' =~ /(\\)/ ? print "OK\n" : print "NO MATCH!\n"; # OK
'\\' =~ /$pat/ ? print "OK\n" : print "NO MATCH!\n"; # Unmatched ( in regex
my $pat2 = '(\\\)';
'\\' =~ /$pat2/ ? print "OK\n" : print "NO MATCH!\n"; # OK
답변1
문제는 백슬래시에 대한 난해한 규칙을 잘못 적용하거나 잘못 기억하고 있다는 것입니다.
백슬래시는 구분 기호나 다른 백슬래시가 뒤에 오지 않는 한 백슬래시를 의미하며, 이 경우 구분 기호나 백슬래시가 삽입됩니다.
따라서 소스 코드의 백슬래시 뒤에는 단일 백슬래시를 나타내는 또 다른 백슬래시가 오기 때문에 값은 $pat
3자 문자열입니다. 소스 코드의 처음 두 개의 백슬래시는 하나의 백슬래시를 나타내고 그 뒤에 세 번째 백슬래시가 오기 때문에 (\)
값은 $pat2
4자 문자열입니다 . 따라서 문자열에서 두 번째 백슬래시로 단독으로 사용됩니다.(\\)
)
안에정규식, 백슬래시는 영숫자가 아닌 한 다음 문자를 인용합니다. /$pat/
마찬가지로 /(\)/
, 이는 시작 그룹이고 그 뒤에 리터럴 닫는 괄호가 오고 )
그룹의 닫는 괄호가 없습니다. 열린 그룹, 백슬래시 또는 닫힌 그룹 /$pat2/
과 동일합니다 ./(\\)/
답변2
에 할당하면 $pat
첫 번째 백슬래시가 두 번째 백슬래시를 이스케이프하므로 결과 문자열에는 백슬래시가 하나만 포함됩니다. 정규식을 처리할 때 닫는 대괄호를 이스케이프하여 캡처 그룹을 닫는 데 이스케이프되지 않은 대괄호를 남기지 않습니다.
즉, m//
백슬래시는 한 번만 해석되지만 내에서도 해석되므로 '...'
총 두 번 처리됩니다.
$ cat p.pl
$pat = '(\\)'; print $pat
$ perl -l p.pl
(\)
~에서수동:
인용형 연산자
q/STRING/
'STRING'
작은따옴표로 묶인 리터럴 문자열입니다. 백슬래시는 구분 기호나 다른 백슬래시가 뒤에 오지 않는 한 백슬래시를 의미하며, 이 경우 구분 기호나 백슬래시가 삽입됩니다.
(물론 이는 셸에서 백슬래시와 작은따옴표가 작동하는 방식과 다릅니다.)