perl: Exportiert Symbole aus einem Modul mit einem Paket

7

Modul foo / bar.pm

%Vor%

ein Verbraucher, der das tut

%Vor%

erhält nicht den foo::wizzy::x Export

Ich weiß, dass ich zwei getrennte Module machen kann, aber trotzdem sollte ich in der Lage sein, das zu funktionieren, oder?

    
pm100 09.11.2009, 23:52
quelle

4 Antworten

3

Setzen Sie am Ende des Moduls:

%Vor%

Dann kann der Code einfach sagen:

%Vor%

um die Exporte von foo :: wizzy zu erhalten.

    
ysth 10.11.2009, 02:56
quelle
7

Sie können dies tun, indem Sie export_to_level des Exporters exportieren Methode, um das "Hauptpaket" die Symbole des "anderen" Pakets wie folgt zu exportieren:

%Vor%

Wenn jedoch Some::Other::Module etwas komplizierter als "export alles" macht, benötigen Sie wahrscheinlich eine bessere Handhabung für @_ .

Ich muss wirklich fragen warum , obwohl - ich kann mir keine Verwendung vorstellen, die mit den Worten "guter Code" kompatibel ist:)

    
hobbs 10.11.2009 00:11
quelle
7

Wenn Sie use foo::bar aufrufen, geschieht im Wesentlichen folgendes:

%Vor%

(siehe perldoc -f )

So import wird nie auf foo::wizzy aufgerufen. Wenn Sie diese Symbole ebenfalls importieren möchten, können Sie BEGIN { foo::wizzy->import } selbst aufrufen (nach use foo::bar ). Oder, wie Sie gesagt haben, teilen Sie diese beiden Pakete in separate Dateien auf, die viel besser lesbar wären.

(Übrigens, es ist nicht ratsam, Paketnamen mit niedrigeren Gehäusen zu verwenden, da diese normalerweise für Perl-Pragmata reserviert sind.)

    
Ether 10.11.2009 00:04
quelle
2

Zunächst finde ich es hilfreich, umschließende Klammern zu verwenden, um den Umfang zu kontrollieren, wenn mehrere Pakete in eine Datei gepackt werden. Wenn man das Paket in einen BEGIN-Block einfügt, funktioniert es eher wie ein korrektes use , das verwendet wurde, um es zu laden, aber das ist meistens, wenn ich das Paket in das Hauptskript packe.

use Foo ist identisch mit BEGIN { require Foo; Foo->import } .

Sie haben also zwei Möglichkeiten:

  • Rufen Sie in Ihrem Hauptskript BEGIN{ Foo::Whizzy->import; } auf.
  • Machen Sie Foo::Bar::import trigger Foo::Whizzy::import für das aufrufende Modul.

In Foo / Bar.pm:

%Vor%

In Ihrem Hauptcode:

%Vor%     
daotoad 10.11.2009 00:25
quelle

Tags und Links