これは興味深い Perl の動作です。(少なくとも私には:))
私は 2 つのパッケージを持っておりPACKAGE1、PACKAGE2どちらが同じ名前の機能をエクスポートしますMethod1()。
これと同じ関数をエクスポートするパッケージが非常に多いためuse、Perl ファイル内のすべてを -ing するのは面倒です。INCLUDES.pmしたがって、これらの s を持つ一般的なインクルード ファイルを作成しましたuse。
含まれるもの.pm:
use PACKAGE1;
use PACKAGE2;
1;
パッケージ1.pm:
package PACKAGE1;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw (
Method1
);
sub Method1{
print "PACKAGE1_Method1 \n";
}
1;
パッケージ2.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()実行され、2 番目の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 モジュールのメソッドのみを使用する必要があります。
たとえば、&が のみを含む場合PACKAGE1、次から使用する必要があります&から使用する必要がありますMethod1(), Method2()PACKAGE2Method1()Method1()PACKAGE2Method2()PACKAGE1
基本的に、プリファレンスに基づいてモジュール間の階層を実現したいと考えています。これには何か方法はありますか?