我正在尝试熟悉 Perl
Exporter
。我面临的问题是,无论我尝试什么,我都无法将 Exporter
与包含多个包的模块一起使用。下面我缺少什么?
MyModule.pm
use strict;
use warnings;
package Multipackage1;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(test1);
sub test1 {
print "First package\n";
}
1;
package Multipackage2;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(test2);
sub test2 {
print "Second package\n";
}
1;
package Multipackage3;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(test3);
sub test3 {
print "Third package\n";
}
1;
MyMainFile.pl
#!/usr/bin/perl
use strict;
use warnings;
use Multipackage;
use Multipackage qw(test3);
print "Calling first package:\n";
test1();
print "Calling second package:\n";
test2();
print "Calling third package:\n";
test3();
我发现
test1
不是主包的一部分。
/
表示 ::
和 + .pm
)。
所以
require
使用包代替实际文件,然后从包中 import。
main.pl
use warnings;
use strict;
require MyModule;
import Multipackage1;
import Multipackage2;
import Multipackage3 qw(test3);
print "Calling first package:\n";
test1();
print "Calling second package:\n";
test2();
print "Calling third package:\n";
test3();
在
MyModule.pm
中,将每个包放在自己的块中以提供词法变量的作用域,因为 package 不这样做,或者使用 package Pack { ... }
since v5.14。不需要所有这些 1
,您可以将 use Exporter;
从块中拉出。
输出
调用第一个包: 第一个包裹 调用第二个包: 第二包 调用第三个包: 第三包
更好的是,将
our @ISA = qw(Exporter);
替换为 use Exporter qw(import);
为
use strict;
use warnings;
package Multipackage1 {
use Exporter qw(import);
our @EXPORT = qw(test1);
sub test1 { print "First package\n" }
}
...
1;
具有相同的输出。请参阅出口商。
请注意,通常不需要也不会将多个包放入一个文件中。