gpt4 book ai didi

perl - 修复此警告的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-05 01:06:48 25 4
gpt4 key购买 nike

我正在尝试使用此 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 closure) An inner (nested) named subroutine is referencing a lexical variable defined in an outer named subroutine.

When the inner subroutine is called, it will see the value of the outer subroutine's variable as it was before and during the first call to the outer subroutine; in this case, after the first call to the outer subroutine is complete, the inner and outer subroutines will no longer share a common value for the variable. In other words, the variable will no longer be shared.

This problem can usually be solved by making the inner subroutine anonymous, using the sub {} syntax. When inner anonymous subs that reference variables in outer subroutines are created, they are automatically rebound to the current values of such variables.



我已经对谷歌做了尽职调查: 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导致此警告。

请帮忙。谢谢!

最佳答案

你有类似的东西

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/ ...
}

关于perl - 修复此警告的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19454266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com