我的perl\lib
文件夹中有一个名为hsfSubs.pm的模块。我在模块中没有任何内容,只有子程序和最后的1;
。
例如,一个子程序名为pause
。我没有实现导入或导出例程。
在我的主要程序中,我只是说use hsfSubs;
,然后我可以毫无问题地致电pause
。如果我说use hsfSubs qw(pause);
,那就同意了。
为什么我需要使用导出器,@EXPORT
和@EXPORT_OK
等或其他任何复杂情况?
Stack Overflow上关于Exporter的问题的多个答案说明了如何使用它,但我不明白为什么要使用它。
答案 0 :(得分:13)
简短版本是你想要一个模块,但你最终得到this调用库的内容。这些都不好,因为它们污染了调用者的命名空间(这会导致很多问题)。但更重要的是,使用require
或use
(与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
指令。使用use
和require
加载的模块必须始终使用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!
use strict; use warnings 'all';
。总是包括那个!这里省略了它以保持视觉上的简单。