我正在努力熟悉Perl导出器,我面临的问题是我尝试的任何东西我都不能使用导出器和包含多个包的模块.我在下面想念的是什么?
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不是主包的一部分.
提前致谢.
解决方法
use调用
require,它查找包名称的文件(使用/ for ::和.pm).
因此,需要使用包来代替实际文件,然后从包中请求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不这样做,或者使用包Pack {…} since v5.14.不需要所有那些1,而你可以拉使用出口商;走出街区.
产量
Calling first package: First package Calling second package: Second package Calling third package: Third package
更好的是,取代我们的@ISA = qw(出口商);使用Exporter qw(import);对于
use strict; use warnings; package Multipackage1 { use Exporter qw(import); our @EXPORT = qw(test1); sub test1 { print "First package\n" } } ... 1;
具有相同的输出.
请注意,通常不需要将多个包放在一个文件中.