Wie kann ich Perl-Module dynamisch integrieren, ohne eval zu verwenden?
Muss ich dynamisch ein Perl-Modul, aber wenn möglich möchte zu bleiben Weg von eval wegen der Arbeit coding-standards. Das funktioniert:
$module = "My::module";
eval("use $module;");
Aber ich brauche einen Weg, es zu tun, ohne eval
wenn möglich. Alle google-suchen führen zu den eval
Methode, aber keiner in irgendeiner anderen Weise.
Ist es möglich, dies zu tun, ohne eval
?
Kommentar zu dem Problem
Duplizieren: stackoverflow.com/questions/442710/...
Tut mir Leid, dass. Ich habe gesucht, aber konnte nichts finden.
Ich würde get your coding-standards aktualisiert. Es ist nichts falsch oder unsicher über eval ' Ing, was ist im Grunde ein hart codierter string. Es ist der einfachste Weg, das zu erreichen, was Sie wollen. Wenn Sie vorbei sind im Benutzer-Eingabe, das ist eine andere Geschichte...
InformationsquelleAutor der Frage user226723 | 2009-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
erfordern
laden von Modulen zur Laufzeit. Es oft eine gute Idee, wickeln Sie diese in einen block (nicht als string)eval
wenn das Modul nicht geladen werden kann.Den Grund für die
eval {...} or do {...}
syntax und eine Kopie$@
ist, weil$@
ist eine Globale variable, die gesetzt werden können durch viele verschiedene Dinge. Sie wollen, packen Sie den Wert so atomar wie möglich zu vermeiden, eine race condition, wo etwas anderes ist es, einen anderen Wert.Wenn Sie nicht wissen, den Namen des Moduls, bis die Laufzeit, die Sie haben zu tun, die die übersetzung zwischen den Modul-Namen (Mein::Modul) und der Dateiname (Mein/Modul.pm) manuell:
InformationsquelleAutor der Antwort Michael Carman
Wie wäre es mit dem core-Modul Module::Load
Dein Beispiel:
"Module::Load - Laufzeit erfordern, die von beiden Modulen und Dateien"
"Last entfällt die Notwendigkeit, zu wissen, ob Sie versuchen, entweder eine Datei oder ein Modul."
Wenn es nicht gelingt, stirbt Sie, mit etwas, das wie "nicht finden Können xxx in @INC (@INC contains: ...".
InformationsquelleAutor der Antwort DavidG
Gut, es gibt immer
erfordern
wie inBeachten Sie, dass Sie verlieren, was auch immer Effekte Sie bekommen von der
import
genannt werden, die zur Kompilierzeit statt zur Laufzeit.Edit: Die Unterschiede zwischen dieser und der eval-Weise: eval können Sie die normalen Modul-syntax und gibt Ihnen ein deutlicher Fehler, wenn das Modul-name ungültig ist (im Gegensatz zu bloß nicht gefunden). OTOH, das eval Weg ist (potentiell) mehr unterliegt willkürlichen code-injection.
InformationsquelleAutor der Antwort Dan
Nein, es ist nicht möglich, ohneeval
alsrequire()
Bedürfnisse der bareword Modul-Namen, wie beschrieben, bei perldoc -f require. Aber es ist nicht eine böse Verwendung von eval, da es nicht erlaubt das einschleusen von schädlichem code (vorausgesetzt, Sie haben die Kontrolle über den Inhalt der Datei, die Sierequire
ing, natürlich).EDIT: Code geändert unter, aber ich gehe die erste version für Vollständigkeit.
Benutze ichich verwendet, um zu verwenden dieses kleine Zucker-Modul, dynamische Lasten bei Laufzeit:PS. Ich starre auf diese definition (ich schrieb es schon eine ganze Weile her) und bin ich am grübeln hinzufügen:
$class->export_to_level(1, undef, @imports);
... es sollte arbeiten, aber nicht getestet.BEARBEITEN: version 2 jetzt viel schöner ohne eval (Dank ysth): 🙂
InformationsquelleAutor der Antwort Ether
Class::MOP auf CPAN hat eine load_class Methode für diese:
http://metacpan.org/pod/Class::MOP
InformationsquelleAutor der Antwort Terrence Brannon
ich mag Dinge zu tun, wie..
require Win32::Console::ANSI if ( $^O eq "MSWin32" );
InformationsquelleAutor der Antwort ShoeLace