Perl: Zwei Pakete in derselben Datei können nicht dasselbe Paket importieren?

Dies ist ein interessantes Perl-Verhalten. (zumindest für mich :))

Ich habe zwei PaketePACKAGE1 undPACKAGE2 Welche Exporte funktionieren mit dem gleichen NamenMethod1().

Da es so viele Pakete geben wird, die dieselbe Funktion exportieren,use-Alles in einer Perl-Datei ist mühsam. Also habe ich eine allgemeine Include-Datei erstelltINCLUDES.pm welche haben dieseuses.

INKLUSIVE.pm:

use PACKAGE1;
use PACKAGE2;

1;

PAKET1.pm:

package PACKAGE1;

use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw (
          Method1
);

sub Method1{
print "PACKAGE1_Method1 \n";
}

1;

PAKET2.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();

Das Motiv ist, nur die neuesten PaketeMethod1() sollte in jeder Perl-Datei verwendet werden.

Die Ausgabe überrascht mich. Ich würde das beide erwartenMethod1() ruft anTests.pl sollte Erfolg sein. Aber nur der ersteMethod1() führt das zweite ausMethod1() Anruf sagt "undefiniert".

AUSGABE:

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.

Hat jemand irgendwelche Antworten / Ansichten dazu?

Das eigentliche Szenario:

Die Methoden in mehreren Perl-Modulen haben denselben Namen. Die Methoden des Perl-Moduls "Hohe Präferenz" sollten jedoch nur verwendet werden.

Zum Beispiel, wennPACKAGE1 enthältMethod1(), Method2() & PACKAGE2 enthält nurMethod1(), dannMethod1() sollte verwendet werden vonPACKAGE2 & Method2() sollte verwendet werden vonPACKAGE1

Grundsätzlich möchte ich eine Hierarchie zwischen Modulen basierend auf Präferenzen erreichen. Gibt es dafür einen Weg?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage