Wie verwende ich ein Perl-Paket bekannt ist, nur in der runtime?
Habe ich ein Perl-Programm, dass nutzen muss, die Pakete (die ich auch Schreibe). Einige dieser Pakete sind nur gewählt, Laufzeit (basierend auf einige environment-Variablen). Ich will nicht in meinem code ein "verwenden" - Linie für alle diejenigen Pakete, natürlich, aber nur ein "verwenden" - Linie, basierend auf diesen Variablen, so etwas wie:
use $ENV{a};
Leider funktioniert das nicht, natürlich. Irgendwelche Ideen auf, wie dies zu tun?
Vielen Dank im Voraus,
Oren
Du musst angemeldet sein, um einen Kommentar abzugeben.
"
use
" funktioniert nicht gut, weil hier nur Einfuhren im Rahmen dereval
.Als @Manni sagte, eigentlich ist es besser, zu verwenden, erfordern. Zitat aus
man perlfunc
:"use" - Statements ausgeführt werden zu Kompilierzeit, nicht zur Laufzeit. Müssen Sie benötigen, um Ihre Module statt:
Ich würde UNIVERSAL::require. Es hat sowohl erfordern und verwenden verwenden, um einem Paket. Die verwenden wird die Methode auch aufrufen import für das Paket.
Die Sie wahrscheinlich verwenden wollen
require
stattuse
wenn Sie nicht möchten, dass es geschehen wird zur compile-Zeit, und dann manuell importieren Sie beliebige Symbole, die Sie benötigen. Sehen diesen link, um das Perl-Kochbuch (von Google Bücher) für eine gute Diskussion von Methoden, die Sie verwenden können, um zu erreichen, was Sie wollen.Ich denke, dass ein Modul geladen-runtime-werden kann ein Plugin. Ich habe diese Art von problem, dass bestimmte Module auf einige Fälle, die geladen werden im Lauf der Zeit als plugins mit Module::Pluggable.
Vielleicht brauchen Sie zum ändern der Logik der Module, aber es funktioniert und das sehr gut skalieren (meine app gestartet mit vier Modulen und haben jetzt zwanzig und er wächst).
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: ...".
Viele Jahre später
eval "use $mod_name";
scheint zu funktionieren (so zumindest 5.8.8).Den Vorteil, über
eval "require $mod_name";
ist, dass das geladene Modul die Standard-Exporte sind automatisch importiert; in anderen Worten:eval "use $mod_name";
ist das kürzere äquivalent
eval "require $mod_name"; $mod_name->import();
Hier ist ein test-Befehl auf und übergibt den Namen des Moduls über env. variable
mod_name
lädt und importiert das Modul verwendet dann eine importierte Funktion (setzt eine POSIX-shell):ich kann die fehlenden Feinheiten; wenn dem so ist, lasst es mich bitte wissen.