在Perl中,为什么我需要Exporter?

时间:2016-07-05 02:26:42

标签: perl module perl-exporter

我的perl\lib文件夹中有一个名为hsfSubs.pm的模块。我在模块中没有任何内容,只有子程序和最后的1;

例如,一个子程序名为pause。我没有实现导入或导出例程。

在我的主要程序中,我只是说use hsfSubs;,然后我可以毫无问题地致电pause。如果我说use hsfSubs qw(pause);,那就同意了。

为什么我需要使用导出器,@EXPORT@EXPORT_OK等或其他任何复杂情况?

Stack Overflow上关于Exporter的问题的多个答案说明了如何使用它,但我不明白为什么要使用它。

1 个答案:

答案 0 :(得分:13)

简短版本是你想要一个模块,但你最终得到this调用库的内容。这些都不好,因为它们污染了调用者的命名空间(这会导致很多问题)。但更重要的是,使用requireuse(与do相对)加载它们是错误的。

如果它已被正确编写为模块,那么您的示例将无效。出口商是解决这个问题的方法。

让我们深入了解细节。

就像我说的那样,你的模块存在问题。正如你已经注意到的那样,尽管有这个bug,它仍然有效。

$ cat Buggy.pm
sub test { "ok!" }
1;

$ perl -e'use Buggy; CORE::say(test());'
ok!

但那只是因为你的例子太简单了。让我们添加一个正确编写的 [1] 模块。

$ cat Buggy.pm
sub test { "ok!" }
1;

$ cat Other.pm
package Other;
use Buggy;
1;

$ perl -e'use Other; use Buggy; CORE::say(test());'
Undefined subroutine &main::test called at -e line 1.

模块中的错误是它没有package指令。使用userequire加载的模块必须始终使用package指令。但是只要你添加它,你的模块就会停止工作。

$ cat NotBuggy.pm
package NotBuggy;
sub test { "ok!" }
1;

$ perl -e'use NotBuggy; CORE::say(test());'
Undefined subroutine &main::test called at -e line 1.

导出器用于解决该问题。

$ cat Final.pm
package Final;
use Exporter qw( import );
our @EXPORT = qw( test );
sub test { "ok!" }
1;

$ perl -e'use Final; CORE::say(test());'
ok!
  1. 嗯,不是真的。如果写得正确,则包括使用use strict; use warnings 'all';。总是包括那个!这里省略了它以保持视觉上的简单。