Ich schreibe ein Tool, das eine Reihe von anderen Perl-Konfigurationsdateien importieren muss. Die Dateien sind nicht mit Paketen verpackt und können ähnliche oder widersprüchliche Variablen/Funktionen haben. Ich habe nicht die Möglichkeit, das Format dieser Dateien zu ändern, also muss ich umgehen, was sie sind. Was ich denken wollte, war jeden in einen eindeutigen Namensraum zu importieren, aber ich habe keinen Weg gefunden, das zu tun, indem ich do
, require
oder use
benutze. Wenn ich keine dynamischen Namen, nur einen fest codierten Namen verwende, kann ich es tun.include/eval Perl-Datei in eindeutigen Namespace zur Laufzeit definiert
so etwas wie dieses Wollen:
sub sourceTheFile {
my ($namespace, $file) = @_;
package $namespace;
do $file;
1;
return;
}
Das funktioniert nicht, weil das Paket Befehl für den Namen eine Konstante erfordert. Also versuche ich, etwas wie folgt aus:
sub sourceTheFile {
my ($namespace, $file) = @_;
eval "package $namespace;do $file;1;"
return;
}
Aber der Inhalt der Datei durch do
gelesen werden, in dem main::
Umfang nicht das, was ich will platziert. Der Zielbereich wird erstellt, nur nicht von do
aufgefüllt. (Ich versuchte erfordern, und nur eine gerade cat $file
innerhalb der Eval als auch.)
Ich benutze Devel::Symdump
, um zu überprüfen, dass die Namespaces korrekt erstellt werden oder nicht.
Beispiel Eingabedatei:
my $xyz = "some var";
%all_have_this = (common=>"stuff");
zusätzliche Herausforderung
die Antwort verwenden, die die temporäre Datei Build tut und nennst, kann ich diese Arbeit dynamisch machen, wie ich brauche. ABER, groß aber, wie referenziere ich jetzt die Daten innerhalb dieses neuen Namespace? Perl scheint nicht die Fähigkeit zu verlieren, einen Variablennamen aus einer Zeichenfolge zu erstellen und diese als Variable zu verwenden.
Bitte poste ein [mcve]. – melpomene
Es ist ein bisschen mehr Arbeit von vorne, aber ein Haken in '@ INC' wäre eine robustere Möglichkeit, dies zu tun. –
Du erkennst, wenn du 'my $ xyz = '...' hast und du das in ein Paket legst, kannst du nicht von außerhalb des Pakets darauf zugreifen, richtig? –