【问题标题】:What is the correct way to fix this warning?解决此警告的正确方法是什么?
【发布时间】:2013-10-27 13:39:24
【问题描述】:

我正在尝试使用这个tool。 (Perl 版本)但是,当我尝试使用推荐的命令 perl bin/SWOG.pl --input=examples/simple.swog --toPng=simple 运行它时,它会显示以下警告(添加了 use diagnostics,希望它能帮助您了解如何修复它)

Variable "$np" will not stay shared at (re_eval 8) line 2 (#1)

(W 闭包) 一个内部(嵌套的)命名子例程正在引用一个 在外部命名子例程中定义的词法变量。

调用内部子程序时,会看到 first 之前和期间的外部子例程变量 调用外部子程序;在这种情况下,在第一次调用 外部子程序完成后,内部子程序和外部子程序将没有 不再共享变量的公共值。换句话说, 变量将不再共享。

这个问题通常可以通过制作内部子程序来解决 匿名,使用 sub {} 语法。当内部匿名潜艇 外部子程序中的引用变量被创建,它们 会自动反弹到此类变量的当前值。

我已经对 Google 进行了尽职调查:link,但仍然不明白如何在我的情况下应用它。

我还回到了导致此问题的代码 sn-p 的source。为了方便参考,下面再次生成sn-p:

    # parentheses balance pattern
    # @ http://www.unix.org.ua/orelly/perl/prog3/ch05_10.htm
    $np= qr{
       \(
       (
       (?:
          (?> [^()]+ )    # Non-parens without backtracking
        |
          (??{ $np })     # Group with matching parens
       )*
       )                    
       \)
    }x;

我认为同一变量$np 定义中的嵌套$np 导致了此警告。

请帮忙。谢谢!

【问题讨论】:

    标签: perl


    【解决方案1】:

    你有类似的东西

    sub f {
       my $np;
       $np = qr/...(??{ $np }).../;
    }
    

    (??{...}) 在模式编译时捕获其中的词法。

    在您的情况下,因为模式是常量,所以 qr// 中的正则表达式模式在 qr// 本身被编译时被编译。不幸的是,每次函数运行时都会创建一个新的$np

    您可以通过避免使用词法变量来解决问题。

    sub f {
       local our $np;
       $np = qr/...(??{ $np }).../;
       ... /$np/ ...
    }
    

    或者在执行 qr// 时强制编译正则表达式模式,方法是将模式设置为变量。

    sub f {
       my $var = '';
       my $np;
       $np = qr/...(??{ $np })...$var/;
       ... /$np/ ...
    }
    

    但是为什么要重复执行qr// 以获得恒定模式呢?最好的解决方案是将模式移出 s​​ub。

    my $np;
    $np = qr/...(??{ $np }).../;
    
    sub f {
       ... /$np/ ...
    }
    

    【讨论】:

    • 您关于使用local our 而不是my 的第一个建议有效。但是我似乎无法让您的下一个建议修复工作。原始表单是 $np = qr{...(??{ $np })...}x;,包裹在 sub parse_tree { } 中——我应该把它改成什么?
    • $np = qr{...}x; 中的尾随 x 是否与您的 $var 等价?
    • 不,关键是要使模式不恒定,以防止优化使其只编译一次。
    • 所有这些修复都是不必要的复杂:为了实现递归,(??{ $np }) 可以替换为(?R)(?0)
    • @amon,第二个注释,(?R)/(?0) 递归整个模式,但这是一个子模式。可能不知道正确的数字。
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 2012-10-10
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2016-11-25
    • 2014-04-08
    相关资源
    最近更新 更多