是否可以使用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期间遇到了这些问题。该软件有一个模块Foswiki.pm
没有 (编辑:似乎package
行package
行只在我的本地副本中丢失了,原因不明)。我的示例中有declares和initializes变量$engine
。还有一个名为view
的CGI脚本,它设置@INC
,然后use Foswiki ();
后跟$Foswiki::engine->run()
。由于未初始化变量,最后一行总是失败:
Can't call method "run" on an undefined value at …/view
在模块的BEGIN
块中,$engine
设置正确但$Foswiki::engine
显然不是。所以看起来这里有两个变量,一个是合格的,另一个是不合格的。
所有这些代码显然适用于其他代码,而以前的版本也适用于我,没有。因此,当我试图了解它是如何破坏的时候,我也试着理解它之前是如何工作的,没有这条线。是否有某种机制可以使这项工作?package
行
答案 0 :(得分:3)
如果代码中没有package
语句,则任何包变量都将声明到main
包中。所以不,你不能做你所描述的。
如果你查看你链接的Foswiki
代码的第2行,你会发现它 有一个包语句。