7

引用するにはperlvar

... の値$/は文字列であり、正規表現ではありません。awk何かのために良くなる必要があります。:-)

このような機能が役立つ状況を考えるのは難しくありません。可変長レコードを含むファイルの解析は、私が何度も遭遇する典型的な使用例です。

これまでのところ、ファイル全体をメモリにロードする際に問題が発生したことはありません。

my @records = split /my_regex/, <> ;

しかし、明らかな理由から、この手法は利用可能なメモリが不十分な状況では使用できません。実際、多くの場合、すべてのレコードを同時に保管する必要はありません。

に戻り$/ます。

言語が の正規表現サポートをプロビジョニングしていないのは奇妙だと思います$/。これは設計によって行われたのですか?実装するのは単に不可能ですか?気の利いた機能がない場合に、ベストプラクティスと見なすことができる他の回避策はありますか?

4

4 に答える 4

3

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 文字の後に正規表現が既に満たされているため)、またはファイル全体を返す必要がありますか (.*可能な限り一致させたいため)? それとも、現在含まれているものは何でも、内部バッファーの残りを返す必要がありますか?

行末に正規表現を使用するには、これらのあいまいさに対処する必要があり、追加の制限を課す必要があります (たとえば、通常の言語のみが許可されます)。

于 2013-10-03T13:16:53.027 に答える
0

Perl6::Slurpは可能な回避策のように見えます:

入力操作の入力レコード区切り ({ irs => $your_irs_here}) を設定できます。区切り文字は、文字列または正規表現として指定できます。

于 2013-10-03T12:23:15.123 に答える