简洁版本
是否可以从在代码块中声明为our
使用非限定名称但在外部使用限定名称的模块访问变量?BEGIN
特别是,这可以在不明确命名模块文件中的包的情况下完成吗?
例子
让demomod.pm
_
use strict;
use warnings;
package demomod;
our $foo;
BEGIN { $foo = 42; }
1;
并且demoscript.pl
成为
#!/usr/bin/perl -Tw
use strict;
use warnings;
BEGIN { @INC = ('.', @INC); }
use demomod;
print $demomod::foo."\n";
在这种情况下,所有名称都同意,并且一切正常。有没有办法package demomod;
从demomod.pm
代码中省略该行并仍然让它工作?
动机
我问的原因是因为我在最近升级Foswiki时遇到了这些问题。该软件有一个没有行的模块(编辑:似乎该行仅在我的本地副本中丢失,原因未知)。它声明并初始化一个变量,就像我的例子一样。还有一个 CGI 脚本,称为which sets and then do后跟. 由于变量未初始化,最后一行对我来说总是失败:Foswiki.pm
package
package
$engine
view
@INC
use Foswiki ();
$Foswiki::engine->run()
Can't call method "run" on an undefined value at …/view
在BEGIN
模块的块中,$engine
设置正确但$Foswiki::engine
显然不是。所以看起来这里有两个变量,一个是合格的,一个是不合格的。
所有这些代码显然都适用于其他人,以前的版本也适用于我,也没有. 因此,当我试图了解它是如何破坏的时,我也试图了解它以前是如何工作的,没有那条线。是否有某种机制可以使这项工作发挥作用?package
一行