解决此警告的正确方法是什么?

时间:2013-10-18 16:13:15

标签: perl

我正在尝试使用此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闭包)内部(嵌套)命名子例程引用a       在外部命名子例程中定义的词法变量。

     

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

     

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

我已经完成了对Google的尽职调查:link,但仍然不明白如何在我的案例中应用此功能。

我还回到了导致此问题的代码段的source。该片段再次在下面生成,以便于参考:

    # 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会导致此警告。

请帮忙。谢谢!

1 个答案:

答案 0 :(得分:5)

你有类似

的东西
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//?最好的解决方案是将模式移出子模式。

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

sub f {
   ... /$np/ ...
}