2009-12-02 4 views
15

qr/STRING/에 대한 docs는 다음과 같이 말합니다 :Perl의 qr/STRING/연산자는 STRING을 컴파일할지 여부를 어떻게 결정합니까?

이 연산자는 STRING을 정규 표현식으로 인용 (가능하면 컴파일)합니다.

나에게 걱정스러운 것은 괄호 안에있는 부분입니다. STRING에서 정규 표현식을 컴파일하고 싶지 않은 경우를 생각할 수 없습니다. 이 괄호 안의 문장은 컴파일이 필요하지 않은 미래의 사건을 다루기위한 족제비 단어인가요? 아니면 STRING이 컴파일되지 않는 오늘의 (또는 이전 버전의 Perl에서) 사건이 있습니까?

+9

"족제비 단어"? 우리의 거룩한 경전에서? 농담 해. – innaM

+2

예, 그건 족제비 단어입니다. – ysth

답변

13

이 문서의 일부는 아마 아래 그림과, qr//의 인수와 같은 상황을 의미한다 "가능하게 컴파일"예를 들어, 당신은 루프의 각 반복에이 패턴을 재 컴파일 할 필요가 없습니다 이미 컴파일 된 정규 표현식입니다.

use re 'debug'; 

$re1 = qr/foo/; 
$re2 = qr/$re1/; 

이 프로그램을 실행하면 컴파일되는 정규식이 하나만 표시됩니다.

본문의 의도에 관계없이 내부 정보에 대한 교활한 암시는 문서 작성을 명확하게하지 못합니다. 나는 의사 패치가 도움이 될 것이라고 생각합니다.

+1

빙고! 'use re 'debug''로 이것을 실행하면 그것을 확인합니다. – innaM

1

정규식에 보간 된 문자열이 포함되어 있으면 항상 컴파일됩니다 (/ o 스위치를 사용하는 경우에는 컴파일되지 않을 수도 있습니다./o는 항상 나를 혼란스럽게합니다). 정규식에 리터럴 텍스트 만 들어 있으면 Adam의 대답이 정확하다고 생각합니다.

는 IIRC이 시나리오를 처리하는 데 의미가있다 :

while (my $foo = $something->next) { 
    my $regex1 = qr/ab(cd+)ef?/; # only compiled once 
    my $regex2 = qr/ab${foo}*ef/; # compiled every time through the loop 
    # do stuff with $regex1 and $regex2 
} 
+1

이것이 의미하는 바가 있다면 그것은 매우 형편 없게 표현됩니다. –

2

편집 :이 답변은 잘못된 것입니다 (또는 적어도 잘못)을하지만 보존 가치가 코멘트에 몇 가지 흥미로운 토론이있다. John Siracusa's answer이 올바른 경로에있는 것으로 보입니다.


qr// 대한 설명서

문자열 m/패턴 PATTERN /와 동일한 방식으로 보간 중임.

아마도 패턴이 변경되지 않은 정규 표현식을 다시 컴파일하지 않는 동작을 포함하거나 보간 된 변수를 포함하지 않는 경우에는 변경할 수 없습니다.

foreach my $char ('a' .. 'z') { 
    my $vowel = qr/[aeiou]/; 
    say "$char is a vowel" if $char =~ $vowel; 
} 
+0

제가 인용 한 섹션과 관련이 있습니까? Perl이 컴파일을 캐싱한다는 사실은'$ 모음 '이'STRING'의 인용되고 컴파일 된 버전으로 넘겨지지 않는다는 것을 의미하지는 않습니다. 내가 묻는 문구는'qr/STRING /'이'STRING'의 인용되지는 않지만 컴파일 된 버전을 반환하는 것이 가능하다고 말하는 것 같습니다. 현재 또는 과거에'qr/STRING /'이 컴파일 된 정규 표현식을 반환하지 않는 경우가 있는지 묻습니다. 어떤 경우도 없다면 그 문장을 명확히하기 위해 패치를 제출해야합니다. –

+0

qr 연산자는 내용이 발생할 때마다 해당 내용을 정규식으로 컴파일합니다. (/ o 수정 자의 유무에 관계없이이 작업을 수행합니다.) 루프 위의 $ 모음 = qr/[aeiou]/행을 사용하면 시스템의 예제 실행 속도가 대략 두 배가됩니다. –

+1

@John Siracusa 캐시가있는 것처럼 보이지만 다음 코드를 살펴보십시오. http://gist.github.com/247337 매번 다시 컴파일하면 'diff'와 'same'의 런타임은 동일하지만 '같은'은 약 3 배 빠릅니다. 나는 당신이 보는 시간 차이가'$ 모음 '변수를 생성하고 캐시 된 컴파일 된 정규 표현식을 할당하는데 걸리는 시간이라고 생각한다. –

관련 문제