我试图用“# EXECUTE func-name。后跟一个哈希值”替换每次出现的“EXECUTE func-name”,前提是该 func-name 存在。我下面的正则表达式似乎不同意我的看法。
s/EXECUTE ([\w-]+)\.?/"# EXECUTE $1.\n" . $hash{$1}/eg if (exists($hash{$1}));
请指教。
好吧,您的代码if
在实际的正则表达式之前执行 -condition,因此在执行代码时您可能会收到警告。
使用e
-modifier 时,您可以直接在“替换部分”中使用 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;