如果func-name存在,我试图用“#EXECUTE func-name。后跟哈希值”替换每次出现的“EXECUTE func-name”。我的下面的正则表达式似乎不同意我的看法。
s/EXECUTE ([\w-]+)\.?/"# EXECUTE $1.\n" . $hash{$1}/eg if (exists($hash{$1}));
请告知。
答案 0 :(得分:5)
您的代码在实际正则表达式之前执行if
- 条件,因此在执行代码时可能会收到警告。
使用e
- 修饰符时,您可以直接在“replacement-part”中使用perl-code:
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;
会减慢每个匹配和替换,而不会在整个程序中捕获。这是一个改进:
{{1}}