Perl m//의 Perl 변수 확장

Perl m//의 Perl 변수 확장

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

문제는 백슬래시에 대한 난해한 규칙을 잘못 적용하거나 잘못 기억하고 있다는 것입니다.

안에작은따옴표로 묶인 문자열 리터럴,

백슬래시는 구분 기호나 다른 백슬래시가 뒤에 오지 않는 한 백슬래시를 의미하며, 이 경우 구분 기호나 백슬래시가 삽입됩니다.

따라서 소스 코드의 백슬래시 뒤에는 단일 백슬래시를 나타내는 또 다른 백슬래시가 오기 때문에 값은 $pat3자 문자열입니다. 소스 코드의 처음 두 개의 백슬래시는 하나의 백슬래시를 나타내고 그 뒤에 세 번째 백슬래시가 오기 때문에 (\)값은 $pat24자 문자열입니다 . 따라서 문자열에서 두 번째 백슬래시로 단독으로 사용됩니다.(\\))

안에정규식, 백슬래시는 영숫자가 아닌 한 다음 문자를 인용합니다. /$pat/마찬가지로 /(\)/, 이는 시작 그룹이고 그 뒤에 리터럴 닫는 괄호가 오고 )그룹의 닫는 괄호가 없습니다. 열린 그룹, 백슬래시 또는 닫힌 그룹 /$pat2/과 동일합니다 ./(\\)/

답변2

에 할당하면 $pat첫 번째 백슬래시가 두 번째 백슬래시를 이스케이프하므로 결과 문자열에는 백슬래시가 하나만 포함됩니다. 정규식을 처리할 때 닫는 대괄호를 이스케이프하여 캡처 그룹을 닫는 데 이스케이프되지 않은 대괄호를 남기지 않습니다.

즉, m//백슬래시는 한 번만 해석되지만 내에서도 해석되므로 '...'총 두 번 처리됩니다.

$ cat p.pl 
$pat = '(\\)'; print $pat
$ perl -l p.pl 
(\)

~에서수동:

인용형 연산자
q/STRING/
'STRING'
작은따옴표로 묶인 리터럴 문자열입니다. 백슬래시는 구분 기호나 다른 백슬래시가 뒤에 오지 않는 한 백슬래시를 의미하며, 이 경우 구분 기호나 백슬래시가 삽입됩니다.

(물론 이는 셸에서 백슬래시와 작은따옴표가 작동하는 방식과 다릅니다.)

관련 정보