Perl 正規表現エンジンの (バックトラッキング) 実装は、行末としての使用法と基本的に互換性がありません。この問題の一部は、次の文字が読み取られるときに正規表現全体を再実行したくないということです。たとえば、正規表現を取ります
$/ = qr/ A \w*? B | XY/;
そしてデータストリーム
f o o A 1 2 X Y B b a r
readlineでは、いつ返品する必要がありますか?インクリメンタル マッチングを行うと、次のような結果が得られる可能性があります。
f o o A 1 2 X Y B b a r
A\w\w\w\w B
#=> fooA12XYB
各位置で正規表現全体を再実行すると、次のようになります。
f o o A 1 2 X Y B b a r
A *FAIL
*FAIL
A\w *FAIL
*FAIL
A\w\w *FAIL
*FAIL
A\w\w\w *FAIL
X *FAIL
A\w\w\w\w *FAIL
X Y
#=> fooA12XY
言い換えれば、(優先順位を伴う) 変更は、このマッチングを複雑にします。正規表現エンジンがバックトラックしていない場合 (ただし、テーブル パーサーまたはステート マシンとして実行する場合)、正規表現全体を再実行するか、インクリメンタル マッチングを実行するかに違いはありません。ただし、これが可能な正規表現エンジンは、Perl 正規表現よりも表現力が劣ります。
別の問題は行末です
$/ = qr/ .+ /xs;
そのような「行」を読み取ると、次の文字だけを返す必要がありますか (1 文字の後に正規表現が既に満たされているため)、またはファイル全体を返す必要がありますか (.*可能な限り一致させたいため)? それとも、現在含まれているものは何でも、内部バッファーの残りを返す必要がありますか?
行末に正規表現を使用するには、これらのあいまいさに対処する必要があり、追加の制限を課す必要があります (たとえば、通常の言語のみが許可されます)。