0

我试图用“# EXECUTE func-name。后跟一个哈希值”替换每次出现的“EXECUTE func-name”,前提是该 func-name 存在。我下面的正则表达式似乎不同意我的看法。

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

请指教。

4

1 回答 1

5

好吧,您的代码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;
于 2012-09-11T05:26:51.050 回答