Perl: Dois pacotes no mesmo arquivo não podem importar o mesmo pacote?
Esse é um comportamento interessante do Perl. (pelo menos para mim :))
Eu tenho dois pacotesPACKAGE1
ePACKAGE2
quais exportações funcionam com o mesmo nomeMethod1()
.
Como haverá tantos pacotes que exportarão essa mesma função,use
-ing tudo em um arquivo Perl será tedioso. Então, eu criei um arquivo de inclusão geralINCLUDES.pm
que terá estesuse
s.
INCLUI.pm:
use PACKAGE1;
use PACKAGE2;
1;
PACOTE1.pm:
package PACKAGE1;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw (
Method1
);
sub Method1{
print "PACKAGE1_Method1 \n";
}
1;
PACOTE2.pm:
package PACKAGE2;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw (
Method1
);
sub Method1{
print "PACKAGE2_Method1 \n";
}
1;
Tests.pl:
##################first package################
package Test1;
use INCLUDES;
my @array = values(%INC);
print "@array \n";
Method1();
##################second package################
package Test2;
use INCLUDES; #do "INCLUDES.pm";
my @array = values(%INC);
print "@array \n";
Method1();
O motivo é apenas o pacote mais recenteMethod1()
deve ser usado em qualquer arquivo Perl.
A saída me surpreende. Eu esperaria que ambosMethod1()
chama emTests.pl
deve ser sucesso. Mas apenas o primeiroMethod1()
executa, o segundoMethod1()
chamada diz "indefinido".
SAÍDA:
C:/Perl/site/lib/sitecustomize.pl PACKAGE1.pm C:/Perl/lib/Exporter.pm PACKAGE2
.pmINCLUDES.pm
PACKAGE2_Method1
C:/Perl/site/lib/sitecustomize.pl PACKAGE1.pm C:/Perl/lib/Exporter.pm PACKAGE2
.pm INCLUDES.pm
Undefined subroutine &Test2::Method1 called at C:\Temp\PackageSample\Tests.pl line 15.
Alguém tem alguma resposta / opinião sobre isso?
O cenário atual:
os métodos em vários módulos Perl terão o mesmo nome. Mas os métodos do módulo perl de alta preferência devem ser usados apenas.
Por exemplo, sePACKAGE1
contémMethod1(), Method2()
& PACKAGE2
contém apenasMethod1()
, entãoMethod1()
deve ser usado a partir dePACKAGE2
& Method2()
deve ser usado a partir dePACKAGE1
Basicamente, eu quero alcançar uma hierarquia entre os módulos baseados em Preferência. Existe alguma maneira para isso?