模块代码中的包名称

时间:2013-01-07 10:16:57

标签: perl variables package scope perl-module

短版

是否可以使用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行只在我的本地副本中丢失了,原因不明)。我的示例中有declaresinitializes变量$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。因此,当我试图了解它是如何破坏的时候,我也试着理解它之前是如何工作的,没有这条线。是否有某种机制可以使这项工作?

1 个答案:

答案 0 :(得分:3)

如果代码中没有package语句,则任何包变量都将声明到main包中。所以不,你不能做你所描述的。

如果你查看你链接的Foswiki代码的第2行,你会发现它 有一个包语句。