在Perl中使用导出器的多个包

时间:2017-04-20 05:27:57

标签: perl

我正在尝试熟悉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不是主程序包的一部分。

提前致谢。

1 个答案:

答案 0 :(得分:10)

use来电require,它会查找包含包名称的文件(/:: .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 { ... } {{3} }。不需要所有这些1,您可以将use Exporter;拉出块。

输出

Calling first package:
First package
Calling second package:
Second package
Calling third package:
Third package

更好的是,将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;

具有相同的输出。

请注意,通常不需要将多个包放在一个文件中。