【问题标题】:"exists" function while checking for hash value existence在检查哈希值是否存在时“存在”函数
【发布时间】: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}));

请指教。

【问题讨论】:

    标签: regex perl


    【解决方案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;
    

    【讨论】:

    • 那真是太棒了..!! :-) 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多