Sie fragte in einem Kommentar über Test::Most und wie es Boilerplate reduziert. Schauen Sie sich die import
Methode an. Es lädt die Module in seinen Namensraum, fügt diese Symbole zu @EXPORT
hinzu, ruft dann einen anderen import
durch einen goto
erneut auf, um sie schließlich in den aufrufenden Namespace zu bringen. Es ist eine ernstzunehmende schwarze Magie, die Curtis dort vorfindet, obwohl ich mich frage, warum er so etwas wie import_to_level nicht verwendet hat. Vielleicht gibt es einige Nebenwirkungen, über die ich nicht nachdenke.
Ich spreche ziemlich viel über diese Art der Sache in Avoid accidently creating methods from module exports in The Effective Perler. Es ist in einem anderen Kontext, aber es sind einige der gleichen Probleme.
Hier ist ein anderes Beispiel.
Wenn ein anderes Modul ein Modul lädt, haben Sie Zugriff darauf. Es ist jedoch nicht gut, sich darauf zu verlassen. Hier sind drei separate Dateien:
Top.pm
use 5.010;
package Top;
use File::Spec;
sub announce { say "Hello from top!" }
1;
Bottom.pm
package Bottom;
use parent qw(Top);
sub catfiles { File::Spec->catfile(@_) }
1;
test.pl
use 5.010;
use Bottom;
say Bottom->catfiles(qw(foo bar baz));
say File::Spec->catfile(qw(one two three));
Ich lade nur File :: Spec in Top.pm. Sobald es einmal geladen ist, kann ich es überall in meinem Perl-Programm verwenden. Die Ausgabe zeigt, dass ich in der Lage war, „zu verwenden“, um das Modul in anderen Dateien, obwohl ich es nur in einer geladen:
Bottom/foo/bar/baz
one/two/three
Damit dies funktioniert, wird der Teil des Codes, der das Modul lädt muss geladen werden, bevor Jeder andere Teil des Codes versucht, dieses Modul zu verwenden. Wie gesagt, es ist eine schlechte Idee, sich darauf zu verlassen: Wenn die Ladesequenz sich ändert oder das Lademodul verschwindet, brechen die Dinge.
Wenn Sie jedoch Symbole importieren möchten, müssen Sie das gewünschte Modul explizit laden, während Sie sich in dem Paket befinden, in das Sie importieren möchten. Das ist nur so, weil das exportierende Modul die Symbole in diesem Paket definiert. Es hängt nicht vom Umfang ab.
Ich frage nach dieser Funktionalität, weil Test :: Most und Moose behaupten, es zu tun, aber ich habe nicht herausgefunden, wie sie es tun. – chotchki
Schauen Sie sich die Methode import() in Test :: Most an. So macht es das. Es lädt alle diese Boilerplate-Module manuell und exportiert sie zwei Ebenen nach oben. –
Danke für all die Hilfe für alle! Das Import-Sub war der Schlüssel. (Ich kann mir einfach zukünftige Schmerzen ersparen und einfach Moose gehen). – chotchki