use*_*305 9 perl module perl-exporter
我的perl\lib文件夹中有一个名为hsfSubs.pm的模块.我在模块中没有任何东西,但子程序和1;最后.
例如,一个子程序被命名pause.我没有实现导入或导出例程.
在我的主要程序中,我只是说use hsfSubs;,我随后可以pause毫无问题地打电话.如果我说的话,同样如此use hsfSubs qw(pause);.
为什么我需要使用出口,@EXPORT和@EXPORT_OK等或任何其他并发症?
Stack Overflow上关于Exporter的问题的多个答案告诉我们如何使用它,但我不明白为什么要使用它.
ike*_*ami 13
简短的版本是你想要一个模块,但你最终得到了它所谓的库.这些都不好,因为它们污染了调用者的命名空间(这可能会导致很多问题).但更关键的是,使用require或use(与之相对do)加载它们是错误的.
如果它已被正确编写为模块,那么您的示例将无效.出口商是解决该问题的方法.
让我们深入了解细节.
就像我说的,你的模块有问题.正如你所注意到的,尽管有这个bug,它仍然有效.
$ cat Buggy.pm
sub test { "ok!" }
1;
$ perl -e'use Buggy; CORE::say(test());'
ok!
Run Code Online (Sandbox Code Playgroud)
但那只是因为你的例子太简单了.让我们在混音中添加一个正确编写的[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.
Run Code Online (Sandbox Code Playgroud)
模块中的错误是它没有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.
Run Code Online (Sandbox Code Playgroud)
导出器用于解决该问题.
$ 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!
Run Code Online (Sandbox Code Playgroud)
use strict; use warnings 'all';.总是包括那个!这里省略了它以保持视觉上的简单.