2

perl の否定先読みは、大きな文字列 (長さ > 40000、アクティブな perl および cygwin perl、バージョン 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";
}

これは、perl の 3 つのバージョンすべてで正常に機能します。しかし、スペースを追加して文字列の長さを増やすと、パターンの一致が停止します。

例:my $str = q(A ...some 50000 spaces... B);

親切に助けてください。

4

1 に答える 1

5

Perl は、スタックの成長を制限するために、さまざまな正規表現操作のサイズに内部制限 (ほとんどのシステムでは符号付き 16 ビット整数) を課しています。 この回答には、制限の非常に優れた内訳があります。

経験的なテストから、スペース カウントが 32767 に達したとき、それは失敗したときなので、それは確かにこの制限です。

于 2013-02-08T06:01:36.487 に答える