与出口商多重包装

问题描述 投票:0回答:1

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

perl
1个回答
12
投票

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 { ... }
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;

具有相同的输出。请参阅出口商

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

© www.soinside.com 2019 - 2024. All rights reserved.