Perl: два пакета в одном файле не могут импортировать один и тот же пакет?
Это интересное поведение Perl. (по крайней мере для меня :))
У меня есть две посылкиPACKAGE1
а такжеPACKAGE2
которая экспортирует функцию с тем же именем.Method1()
Поскольку будет так много пакетов, которые будут экспортировать эту же функцию,use
все в файле Perl будет утомительным. Итак, я создал общий файл включенияINCLUDES.pm
которые будут иметь этиuse
s.
INCLUDES.pm:
use PACKAGE1;
use PACKAGE2;
1;
PACKAGE1.pm:
package PACKAGE1;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw (
Method1
);
sub Method1{
print "PACKAGE1_Method1 \n";
}
1;
PACKAGE2.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();
Мотив, только последние пакетыMethod1()
должен использоваться в любом файле Perl.
Результат меня удивляет. Я ожидаю, что обаMethod1()
звонит вTests.pl
должен быть успех. Но только первыйMethod1()
выполняет, второйMethod1()
Звонок говорит "не определенно».
ВЫХОД:
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.
Есть ли у кого-нибудь ответы / взгляды на это?
Фактический сценарий:
методы в нескольких модулях Perl будут иметь одинаковые имена. Но методы из Perl-модуля High preference следует использовать только.
Например, еслиPACKAGE1
содержитMethod1(), Method2()
& PACKAGE2
содержит толькоMethod1()
, затемMethod1()
следует использовать изPACKAGE2
& Method2()
следует использовать изPACKAGE1
В основном я хочу достичь иерархии среди модулей на основе предпочтений. Есть ли способ для этого?