我正在尝试编写一个 perl 脚本,该脚本调用在其他地方(由其他人)编写的函数,该函数操纵我脚本范围内的一些变量。假设脚本是main.pl
并且函数在funcs.pm
. 我的main.pl
样子是这样的:
use warnings;
use strict;
package plshelp;
use funcs;
my $var = 3;
print "$var\n"; # <--- prints 3
{ # New scope somehow prevents visibility of $pointer outside
local our $pointer = \$var;
change();
}
print "$var\n"; # <--- Ideally should print whatever funcs.pm wanted
出于某种原因,使用local our $pointer;
会阻止$pointer
范围之外的可见性。但是,如果我只是使用our $pointer;
,则可以在main.pl
使用范围之外看到变量$plshelp::pointer
(但在中看不到funcs.pm
,所以无论如何它都没用)。作为旁注,有人可以解释一下吗?
funcs.pm
看起来像这样:
use warnings;
use strict;
package plshelp;
sub change
{
${$pointer} = 4;
}
我希望这会在主脚本运行时更改$var
并打印的值。4
但是我得到一个编译错误,说$pointer
没有声明。可以通过在inour $pointer;
的顶部添加来删除此错误,但这会创建一个在任何地方都可见的不必要的全局变量。我们也可以通过删除 来删除这个错误,但这似乎是个坏主意。我们也可以通过使用in让它工作,但写作的人不想这样做。change
funcs.pm
use strict;
$plshelp::pointer
funcs.pm
funcs.pm
有没有一种好方法可以funcs.pm
在不声明全局变量的情况下实现在我的范围内操作变量的功能?如果我们无论如何都要使用全局变量,我想我根本不需要使用动态范围。
假设由于某种原因无法将参数传递给函数。
更新
local our
就防止可见性而言,似乎没有做任何“特殊”。从perldoc:
这意味着 when
use strict 'vars'
生效,our
允许您使用包变量而不用包名限定它,但只能在 our 声明的词法范围内。这立即适用——即使在同一个语句中。
和
即使之前没有使用过包变量,这也可以工作,因为包变量在第一次使用时就会出现。
所以这意味着$pointer
即使在我们离开花括号之后“存在”。只是我们必须使用$plshelp::pointer
而不是 just来引用它$pointer
。但是由于我们local
在初始化之前使用过$pointer
,它在范围之外仍然是未定义的(尽管它仍然是“声明的”,不管这意味着什么)。写这个的更清晰的方法是(local (our $pointer)) = \$var;
. 在这里,our $pointer
“声明”$pointer
并返回$pointer
。我们现在应用local
这个返回值,并且这个操作$pointer
再次返回我们分配给\$var
.
但这仍然留下了一个主要问题,即是否有一个很好的方法来实现所需的功能。