检查哈希值是否存在时“存在”功能

时间:2012-09-11 05:05:28

标签: regex perl

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

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

请告知。

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}}
相关问题