2014-10-10 1 views
0

Perl에서 정규식 일치에 관한 질문이 있습니다.Perl 정규 표현식은 문자열을 변수로 제공 할 때 다르게 일치합니다.

my $r = '^\z'; 
my $s = ""; 
$r =~ /$s/ ? print "Match\n" : print "No match\n"; 

Output: Match 

다음 코드 그러나 인쇄 :

my $r = '^\z'; 
$r =~ /""/ ? print "Match\n" : print "No match\n"; 

Output: No match 

이유는 다음 코드를 참조하십시오? 이게 내가 이해하지 못하는 펄 구문인가요?

+0

인용 부호 (즉,'/ ""/'가 일치하려고하는 것). – Biffen

+1

정규 표현식으로'^ \ z '를 사용하려고합니까? 그렇다면 RHS에 있어야합니다 (예 : '$ foo = ~/^ \ z /'는'$ foo'가 빈 문자열이면 일치합니다. – ThisSuitIsBlackNot

+0

@jabbas가 말한 것처럼 통찰력을 얻으려면''re 'debug'; '를''XX.pl' 소스 맨 위에 놓으십시오. 또한'perlop' 맨 페이지 (따옴표와 같은 연산자)를 읽어보십시오. – sln

답변

4
my $s = ""; 

my $s = ''; 

또는

my $s = q(); 

같은, 즉 그것은 빈 문자열을 $s-을 assings.

$r =~ /""/ 

에서

당신은 $ r에 두 개의 큰 따옴표가 포함되어 있는지 여부를 테스트하고 있습니다.

는, $ s로 큰 따옴표를 할당 여기

my $s = '""'; 
2
my $r = '^\z'; 
$r =~ /""/ ? print "Match\n" : print "No match\n"; 

사용하려면, $ r에 테스트 문자열입니다. /""/은 정규 표현식입니다.
$ r에 ""이 없으므로 일치하지 않습니다.

/""// char로 구분 된 문자열이며 그 결과는 정규식 개체가됩니다. $ s 변수가 아무것도에 주조되어

$str = '""'; 
$rx = qr/$str/; 
+0

음, 절대적으로 정확하려면'$ str = 'some regex'; $ rx = qr/$ str /'은 항상 * qr/some regex /와 같지 않습니다. 정규 표현식 리터럴은 문자열과 구문 분석 규칙이 약간 다릅니다 (예 : 백 슬래시 이스케이프와 임베디드 코드 관련 – amon

1

:
은 동일합니다. 당신은 코드에서 use re 'debug';를 추가, 스스로 그것을 확인하거나 호출 펄 -Mre=debug을 추가 할 수 있습니다

첫 번째 예

$ perl -Mre=debug -E '$r=q{^\z}; $s=""; $r =~ /$s/ ? say "Match" : say "No match"' 
Compiling REx "" 
Final program: 
    1: NOTHING (2) 
    2: END (0) 
minlen 0 
Matching REx "" against "^\z" 
    0 <> <^\z>    | 1:NOTHING(2) 
    0 <> <^\z>    | 2:END(0) 
Match successful! 
    Match 
    Freeing REx: "" 

초 예를 들어 문자열이 포함되어 있지 않기 때문에이다

$ perl -Mre=debug -E '$r=q{^\z}; $r =~ /""/ ? say "Match" : say "No match"' 
Compiling REx "%"%"" 
Final program: 
    1: EXACT <""> (3) 
    3: END (0) 
anchored "%"%"" at 0 (checking anchored isall) minlen 2 
Guessing start of match in sv for REx "%"%"" against "^\z" 
Did not find anchored substr "%"%""... 
Match rejected by optimizer 
    No match 
    Freeing REx: "%"%""