尽管缺少use语句,Perl模块函数调用仍会运行

时间:2014-06-25 15:40:28

标签: perl

我正在开发一个由多个Perl模块组成的库。

以下语句编译并完美运行:

my $x = Foo::Bar::new();

但是模块开头缺少必要的use语句:

use Foo::Bar;

这怎么可能? use是从使用过的还是使用模块传播的?

2 个答案:

答案 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)出现在哪里无关紧要,只要在依赖于它的代码执行之前完成