2013-06-09 1 views
1

에서 패턴을 발견 한 후 정의되지 않은, 그래서 나는 웹에서이 예를 실행 :

#!/usr/bin/perl 
# matchtest2.plx 
use warnings; 
use strict; 
$_ = '1: A silly sentence (495,a) *BUT* one which will be useful. silly (3)'; 
my $pattern = "silly"; 
if (/$pattern/) { 
    print "The text matches the pattern '$pattern'.\n"; 
    print "\$1 is '$1'\n" if defined $1; 
    print "\$2 is '$2'\n" if defined $2; 
    print "\$3 is '$3'\n" if defined $3; 
    print "\$4 is '$4'\n" if defined $4; 
    print "\$5 is '$5'\n" if defined $5; 
} 
else { 
    print "'$pattern' was not found.\n"; 
} 

을 오직 내게 준 :

왜 패턴이 발견 된 후에도 여전히 정의가 정의되지 않았습니까? 나는 Wubi (Ubuntu 12.04 64-bit)를 사용하고 있으며, 나의 perl 버전은 5.14.2이다. 당신의 도움에 미리 감사드립니다.

+1

예상되는 출력은 무엇입니까? – ysth

+2

당신은 어리석은 패턴을 포착하지 않았습니다. – doubleDown

+2

@doubleDown 어쨌든 그 패턴은 바보 같았습니다. – TLP

답변

2

이것은 예상되는 동작입니다! 패턴이 일치하는 것이 분명하기 때문에 해당 if- 블록이 실행된다는 것은 놀라운 일이 아닙니다.

$1, $2, ...에 대한 "역 참조"라는 용어는 약간 차선책 일 수 있습니다.이를 "캡처 그룹"이라고 부릅시다. 정규식에서

, 나중에 기억하기 위해 괄호와 패턴의 일부를 둘러싸 수 있습니다

/(silly)/ 

이 패턴은 하나의 그룹이있다. 이 그룹의 내용은 일치하는 경우 $1에 저장됩니다.

위의 패턴 $2, $3, ...에 대한 모든 undef 될 것이라고 그렇게하지, 패턴에 존재하거나 그렇지 않으면 성공적인 경기에 undef로 설정되어 인구가 아니었다 그룹에 대한 모든 캡처 그룹 변수.

+0

답변 해 주셔서 감사합니다. – mqla

3

문자열을 캡처하지 않습니다. 패턴에 괄호가 없습니다. 당신이했던 경우

my $pattern = "(silly)"; 

당신은 $1에서 뭔가를 얻었을 것이다.

모르겠 으면 $1은 첫 번째 괄호에 캡처 된 텍스트이고 두 번째 괄호는 $2 개입니다.

+0

답변 해 주셔서 대단히 감사합니다! – mqla