Perl:什么时候在模块中使用Export?

时间:2014-02-10 04:43:46

标签: perl perl-module

我对这些行感到困惑

use Exporter;
our @EXPORT =qw(a b);

在一个包中。

我已经看过没有使用@EXPORT的套餐而且工作得很好。很混乱...我已经用Google搜索了但没有找到太多解释。

我的问题是你什么时候应该使用@EXPORT?不使用它的原因是什么?

1 个答案:

答案 0 :(得分:4)

实际上有两个问题(或者你可能只问一个问题,但完整答案必须回答两个问题)。

我何时需要使用导出器

当你'使用'某人的perl模块时,会采取两种截然不同的行动。首先是加载他们的包;第二个是调用他们的包的'import'子。

只是加载他们的包,导致他们的包的内容在他们的包的命名空间中定义。你可以直接使用它,没有第二步,但你必须使用完整的包名称来引用它的所有子等。例如,如果他们的包包含:

package Foo::Bar;

sub fabronicate {
    print "This is a nice sub!\n";
}

那么任何想要使用if的人都必须这样做:

use Foo::Bar;

Foo::Bar::fabronicate();

所有在前面输入Foo :: Bar的所有内容都会很快变旧。解决方案是在包中声明一个'import'子。该子程序负责将公共subs(以及变量和模块应该提供的任何其他内容)导出到调用者的名称空间(“使用模块”的程序包)。

Exporter模块的功能是为您提供“导入”子。这意味着您不必编写一些奇怪的代码来为所有要导出的符号创建别名,这一切都是为您完成的。

请注意,您不必使用Exporter。您可以编写自己的导入例程,或者有其他模块来处理导出符号。

或者您可以让使用您模块的人员始终明确提及包名称。这在面向对象的模块中很常见,因为只有类方法(例如构造函数)需要明确地以包名称为前缀。拥有对象实例后,包查找是自动的。例如:

my $o = Foo::Bar->new();
$o->fabronicate();

我何时需要使用@EXPORT

Exporter模块需要知道包中定义的符号(子,变量等),应该导出哪些符号。通常只会输出一小部分。它会查询一些包变量来找到它:@EXPORT和@EXPORT_OK。

@EXPORT包含您要导出到使用您的模块的任何人的符号列表,他们没有明确提到要导入的符号列表。最初这听起来不错,直到你意识到如果你的模块导出一些也被其他模块导出的名字会有问题。

@EXPORT_OK包含可以导出的符号列表,如果调用模块专门请求它们的话。调用模块使用模块名称后面的名称列表在'use'语句中指定它们。

use Foo::Bar qw(fabronicate);

# Now I can call fabronicate directly!

请注意,提供符号列表的方式有两种:@EXPORT和@EXPORT_OK之间的巨大差异是当有人使用您的模块但没有提供任何列表时会发生的情况,如下所示:

use Foo::Bar;

在这种情况下,导入@EXPORT中定义的所有内容,并且不会导入@EXPORT_OK中定义的任何内容。

还有一些其他变量允许您指定导入多个符号的标记。 Exporter文档是查找此内容的最佳位置。