これは興味深い 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()
PACKAGE2
Method1()
Method1()
PACKAGE2
Method2()
PACKAGE1
基本的に、プリファレンスに基づいてモジュール間の階層を実現したいと考えています。これには何か方法はありますか?