func-nameが存在する場合にのみ、「EXECUTEfunc-name」のすべての出現箇所を「#EXECUTEfunc-name。の後にハッシュ値」で置き換えようとしています。以下の私の正規表現は私に同意していないようです。
s/EXECUTE ([\w-]+)\.?/"# EXECUTE $1.\n" . $hash{$1}/eg if (exists($hash{$1}));
お知らせ下さい。
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;