【发布时间】:2012-09-03 23:46:18
【问题描述】:
我试图用“# EXECUTE func-name。后跟散列值”替换每次出现的“EXECUTE func-name”,前提是 func-name 存在。我下面的正则表达式似乎不同意我的观点。
s/EXECUTE ([\w-]+)\.?/"# EXECUTE $1.\n" . $hash{$1}/eg if (exists($hash{$1}));
请指教。
【问题讨论】:
我试图用“# EXECUTE func-name。后跟散列值”替换每次出现的“EXECUTE func-name”,前提是 func-name 存在。我下面的正则表达式似乎不同意我的观点。
s/EXECUTE ([\w-]+)\.?/"# EXECUTE $1.\n" . $hash{$1}/eg if (exists($hash{$1}));
请指教。
【问题讨论】:
您的代码在实际的正则表达式之前执行if-条件,因此您在执行代码时可能会收到警告。
当使用e-修饰符时,您可以直接在“替换部分”中使用perl-code:
s/EXECUTE\s+([\w-]+)\.?/
if(exists($hash{$1})) {
"# EXECUTE $1.\n" . $hash{$1}
} else {
$&
}/xeg;
我已添加 /x,因此您可以格式化正则表达式以使其真正可读 - 但现在您必须明确匹配空格(这就是我在 EXECUTE 和组之间添加 \s+ 的原因)。 $& 代表整个匹配项(因此,如果 $1 没有哈希条目,则不会发生任何变化)。
也就是说,使用$& 会减慢每次匹配和替换,而不会在整个程序中捕获。这是一个改进:
s/(EXECUTE\s+([\w-]+)\.?)/
if(exists($hash{$2})) {
"# EXECUTE $2.\n" . $hash{$2}
} else {
$1
}/xeg;
【讨论】: