0

func-nameが存在する場合にのみ、「EXECUTEfunc-name」のすべての出現箇所を「#EXECUTEfunc-name。の後にハッシュ値」で置き換えようとしています。以下の私の正規表現は私に同意していないようです。

s/EXECUTE ([\w-]+)\.?/"#  EXECUTE $1.\n" . $hash{$1}/eg if (exists($hash{$1}));

お知らせ下さい。

4

1 に答える 1

5

ifコードは実際の正規表現の前に -conditionを実行するため、コードを実行すると警告が表示される可能性があります。

-modifier を使用する場合e、「replacement-part」で perl コードを直接使用できます。

s/EXECUTE\s+([\w-]+)\.?/
    if(exists($hash{$1})) {
        "#  EXECUTE $1.\n" . $hash{$1}
    } else {
        $&
    }/xeg;

/x を追加したので、正規表現をフォーマットして実際に読みやすくすることができますが、空白を明示的に一致させる必要があります (これが と グループ\s+の間に追加した理由ですEXECUTE)。は$&一致全体を表します (つまり、 のハッシュ エントリがない場合$1、何も変更されません)。


とはいえ、使用すると、$&プログラム全体でキャプチャーを使用せずにすべての試合と置換が遅くなります。ここに改善があります:

s/(EXECUTE\s+([\w-]+)\.?)/
    if(exists($hash{$2})) {
        "#  EXECUTE $2.\n" . $hash{$2}
    } else {
        $1
    }/xeg;
于 2012-09-11T05:26:51.050 に答える