5

大きなスカラーに対して正規表現を実行しています。この試合では何もキャプチャされませんが、この試合の後、私のプロセスは 30M 増加します。

# A
if (${$c} =~ m/\G<<\s*/cgs)
{
    #B
    ...
}

$cはかなり大きなスカラー (約 21M) への参照ですpos(${$c})が、正しい場所にあり、式が最初の文字で一致し、pos(${$c})一致後に正しい場所に更新されることを確認しました。しかし、前述したように、このマッチでは何もキャプチャしていませんが、プロセスは #A と #B の間で約 30M 増加しています。私の記憶はどこへ行くの?

編集:はい、の使用は$&責任がありました。私たちは Perl 5.8.8 を使用しており、スクリプトは組み込みのText::Balancedを使用するGetopt::Declareを使用していました。このモジュールの 1.95 バージョンは を使用していました。Perl 5.10 に同梱されているバージョン 2.0.0 では、参照が削除され、問題が軽減されています。$&$&

4

1 に答える 1

20

コードのどこかに $&、$`、または $' ($MATCH、$PREMATCH、および $POSTMATCH と呼ばれることもあります) について言及していますか? その場合、Perl は、これらの変数を調べたい場合に備えて、正規表現の一致ごとに文字列全体をコピーします。

この場合の「コード内」とは、これらの変数を参照するモジュールを使用したりuse Englishuse English qw( -no_match_vars ).

よくわからない場合は、Devel::SawAmpersandモジュールを使用してそれらが使用されているかどうかを判断し、Devel::FindAmpersandを使用してそれらが使用されている場所を特定できます。

メモリの増加には他の理由があるかもしれません (使用している Perl のバージョンはどれですか?) が、マッチ変数を使用すると確実にメモリが吹き飛ばされるため、原因である可能性があります。

チェリオ、

ポール

于 2008-10-03T04:21:32.680 に答える