2013-02-08 3 views
2

perl 네가티브 미리보기는 큰 문자열 (길이가 40000 이상, 액티브 펄과 cygwin 펄, 버전 5.14)에서 작동하지 않는다. 나는 mingw perl 5.8.8와 동일한 코드를 시도하고 5000이대용량 문자열을 앞두고 펄블 네거티브가 보이지 않는다.

내가 사용하고있는 코드는> 길이 문자열을 작동하지 :

my $str = q(A B); 
my $pattern = '(A)(?:(?!(X)).)*(B)'; 
if ($str =~ m/$pattern/) { 
    print "matched\n"; 
} 

이 펄의 세 가지 버전의 잘 작동합니다. 그러나 공백을 추가하여 문자열의 길이를 늘리면 패턴 일치가 중지됩니다. 예컨대 : my $str = q(A ...some 50000 spaces... B);

친절하게 도움을

.

+2

'세그먼트 오류'와 같은 오류가 발생합니까? –

+0

segfault 없음; 그것은 단지 일치를 멈춘다. 네거티브 룩을 제거하면 긴 문자열에서도 패턴이 일치합니다. – user2053270

답변

5

Perl은 스택 확장을 제한하기 위해 다양한 정규 표현식 연산의 크기에 대한 내부 제한 (대부분의 시스템에서 부호있는 16 비트 정수일 수 있음)을 부과합니다. This answer에는 한계가 매우 양호합니다.

경험적 테스트에서 스페이스 카운트가 32767이되면 실패 할 때가되므로이 한계가됩니다.

+0

mingw perl 5.8.8에서 길이가 4500보다 큰 문자열조차 일치하지 않습니다. 경고 또는 오류가 표시되지 않습니다. – user2053270

+0

5.8. *에서 정규 표현 엔진은 단순히 스택을 소모하고 동작은 정의되지 않습니다. perl 5.10 이후에서는 스택을 사용하지 않으므로 더 이상 발생하지 않습니다. – moritz

+0

hrunting, @moritz 감사합니다; 이 한도를 늘리려면 어떻게해야합니까? – user2053270