我正在尝试使用这个工具.(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闭包)内部(嵌套)命名子例程引用外部命名子例程中定义的词法变量.
当调用内部子程序时,它将看到外部子程序变量的值,就像它在第一次 调用外部子程序之前和期间一样; 在这种情况下,在第一次调用外部子程序完成后,内部子程序和外部子程序将不再共享该变量的公共值.换句话说,该变量将不再共享.
通常可以通过使用sub {}语法使内部子例程匿名来解决此问题.当创建引用外部子例程中的变量的内部匿名子时,它们会自动回弹到这些变量的当前值.
我已经对Google做了尽职调查:链接,但仍然不明白如何在我的情况下应用这个.
我还回到了导致此问题的代码段的源代码.该片段再次在下方生成,以便于参考:
# 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;
Run Code Online (Sandbox Code Playgroud)
我认为嵌套$np在同一个变量的定义中$np会导致此警告.
请帮忙.谢谢!
你有类似的东西
sub f {
my $np;
$np = qr/...(??{ $np }).../;
}
Run Code Online (Sandbox Code Playgroud)
(??{...}) 在编译模式时捕获其中的词汇.
在您的情况下,因为模式是常量,所以在qr//编译qr//自身时编译正则表达式模式.不幸的是,$np每次运行函数时都会创建一个new .
您可以通过避免词法变量来解决问题.
sub f {
local our $np;
$np = qr/...(??{ $np }).../;
... /$np/ ...
}
Run Code Online (Sandbox Code Playgroud)
或者通过强制通过使模式变量执行qr //来编译正则表达式模式.
sub f {
my $var = '';
my $np;
$np = qr/...(??{ $np })...$var/;
... /$np/ ...
}
Run Code Online (Sandbox Code Playgroud)
但为什么要qr//反复执行一个恒定的模式?最好的解决方案是将模式移出子模块.
my $np;
$np = qr/...(??{ $np }).../;
sub f {
... /$np/ ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |