我正在开发一个由多个Perl模块组成的库。
以下语句编译并完美运行:
my $x = Foo::Bar::new();
但是模块开头缺少必要的use
语句:
use Foo::Bar;
这怎么可能? use
是从使用过的还是使用模块传播的?
答案 0 :(得分:1)
首先是背景。
use Foo::Bar;
是
的缩写BEGIN {
require Foo::Bar;
import Foo::Bar;
}
import Foo::Bar;
调用模块的import
方法(如果存在)。每次使用use
时都会发生这种情况。没有参数,大多数模块“import
导出一个默认的符号列表或根本没有。
如果您不需要导入任何内容(如程序中的情况),可以使用
放弃导入use Foo::Bar ();
这是一个与
相当的特例BEGIN {
require Foo::Bar;
}
require Foo::Bar;
是加载模块的原因。无论您执行require Foo::Bar;
(或use Foo::Bar;
)多少次,每个解释器都会加载(执行)一次模块。
在您的情况下,您可能加载了一个加载Foo :: Bar的模块。这允许你省略use Foo::Bar ();
,因为它无论如何都不会做任何事情。
答案 1 :(得分:0)
您没有显示任何重要代码,但您 使用的其中一个模块可能会加载Foo::Bar
,使其可用于每个包中的代码。
use
(或require
)出现在哪里无关紧要,只要在依赖于它的代码执行之前完成