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

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

简短的版本是你想要一个模块,但你最终得到了所谓的库.这些都不好,因为它们污染了调用者的命名空间(这可能会导致很多问题).但更关键的是,使用requireuse(与之相对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)
  1. 好吧,不是真的.如果写得好,就会包括使用use strict; use warnings 'all';.总是包括那个!这里省略了它以保持视觉上的简单.

  • 简而言之,划分代码需要一些额外的代码,但它使程序远远不那么复杂. (6认同)
  • 也许你应该包括你的第二个例子停止工作的原因.当使用`use`或`require`时,Perl只加载一次文件.它跟踪它加载的内容(在'%INC`中).因为没有命名空间,所以subs会被放入当前命名空间,然后首先加载它.如果你再次尝试加载它,它将忽略它并再次运行`import`,但由于没有任何东西可以导入,所以没有任何反应.然后你的新的当前命名空间(在这种情况下是`main`)没有sub,并且有一个_undefined_错误. (2认同)