Wie kann ich eval environment-Variablen in Perl?
Ich würde gerne bewerten, eine Umgebungsvariable und legen Sie das Ergebnis einer Variablen zu:
$x=eval($ENV{EDITOR});
print $x;
Ausgänge:
/bin/vi
funktioniert einwandfrei.
Wenn ich eine Umgebungsvariable festlegen, ZITAT \ " und versuchen, die gleiche Sache:
$x=eval($ENV{QUOTE});
print $x;
Ausgänge:
(nichts)
$@ set to: "Can't find a string terminator anywhere before ..."
Ich möchte nicht einfach eingestellt $x=$ENV{QUOTE};
als die eval wird auch benutzt, um ein Skript aufrufen und wieder in seine letzten Wert (sehr praktisch), so würde ich mag zu halten mit den eval(); Beachten Sie, dass alle Environment-Variablen eval ' ed auf diese Weise werden von mir in einem anderen Ort, so bin ich nicht besorgt mit bösartigen Zugriff zu den environment-Variablen eval-ed-auf diese Weise.
Vorschläge?
- Was sind Sie wirklich erreichen wollen? Diese Frage stellen und vielleicht können wir Ihnen besser helfen. 🙂
- Nicht blind eval %ENV user input; das ist unglaublich gefährlich. eval ruft den perl-interpreter und %ENV sind schon gültig, perl-Skalare. Es wird nicht alles tun, am besten, und kann zu großen Schäden im schlimmsten Fall. Kann jeder code in EDITOR, um korrupte Ihr system oder zerstören von sensiblen Daten, die Ihnen oder nicht.
- Ehrlich, dass ist die Frage, die ich Wünsche, zu Fragen. Ich kontrolliere den Wert der environment-Variablen in diesem Prozess verwendet (damit bin ich nicht blind der Bewertung der Umgebung, da war es früher Satz von "mir"). Ich muss eval viele verschiedene Dinge, und das ist nur eine. Ich glaube, dass ich über eine angemessene Antwort. Thx
- Warum sind Sie den Aufruf von eval() auf diese? Was denkst du, was eval() macht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, es macht natürlich nichts.
Wenn Ihr ENV varaible text enthält, der die Hälfte-code, aber ist das nicht, und geben Sie die resultierende Zeichenfolge an etwas, das evaluates, dass der code als Perl, von natürlich es ist nicht zur Arbeit gehen.
Du hast nur 3 Optionen:
Könnte man sich ja auch beschweren, dass
Ist kein Gültiger code, denn das ist im wesentlichen was passiert.
Proben der Festsetzung der Wert von 'QUOTE' zu arbeiten
Warum sind Sie
eval
'ing in den ersten Platz? Sollten Sie nur sagen,Den
eval
ist ausführen die Zeichenfolge in$ENV{QUOTE}
als ob es waren Perl-code, die ich sicherlich hoffe, dass er es nicht ist. Das ist der Grund, warum \ verschwindet. Wenn Sie waren zu überprüfen, die$@
variable, die Sie finden würde eine Fehlermeldung wiesyntax error at (eval 1) line 2, at EOF
Wenn Sie Umgebungsvariablen gehen, um die code enthalten, sollte die Perl ausführen, dann sollten Sie schauen in die Sicher Modul. Es ermöglicht Ihnen, zu kontrollieren, welche Art von code ausführen kann, in einem
eval
so dass Sie nicht versehentlich wind bis die Ausführung etwas wie"use File::Find; find sub{unlink $File::Find::file}, '.'"
Auswertung eines Umwelt Wert ist sehr gefährlich, und würde Fehler erzeugen, wenn unter taint-Modus.
Nun Stell dir vor, wenn dieses Skript ausgeführt wurde, mit root-Zugriff, und wurde geändert, um tatsächlich löschen Sie die Datei system.
Kent ' s Antwort, während technisch korrekt, verfehlt den Punkt. Die Lösung ist nicht zu verwenden
eval
besser, aber nicht verwendeneval
an alle!Den Kern des Problems scheint zu sein, zu verstehen, was
eval STRING
tut (es isteval BLOCK
die komplett anders ist trotz des gleichen namens). Es nimmt eine Zeichenfolge und läuft es als Perl-code. Zu 99,99% ist dies unnötig und gefährlich und die Ergebnisse in spaghetti-code und Sie absolut sollte nicht sein, so früh in Ihrem Perl-Programmierung Karriere. Sie fand die Pistole in Ihre papas Socke-Schublade. Die Entdeckung, dass es Blasen kann Löcher in Dinge, die Sie jetzt versucht, es zu benutzen, hängen Sie ein Plakat. Es ist besser zu vergessen, dass es existiert, dein code wird so viel besser für Sie.$x = eval($ENV{EDITOR});
nicht tun, was Sie denken, es tut. Ich weiß nicht einmal wissen, was Sie denken, es tut, dass Sie es sogar schon benutzt, es bedeutet wissen Sie nicht. Ich weiß auch, dass Sie mit Warnungen ab, weil Perl Schreien würde bei Euch. Warum? Lassen Sie uns davon ausgehen, dassEDITOR
eingestellt ist/bin/vi
. Die oben ist äquivalent zu$x = /bin/vi
die gar nicht gültig Perl-code.Ich bin mir nicht sicher, wie Sie es in den ersten Platz. Ich vermute, dass Sie Links etwas aus Ihrem Beispiel. Vielleicht tweaking-EDITOR, bis es geklappt hat?
Sie nicht haben, etwas zu tun magischen auf eine Umgebungsvariable Einlesen. Nur
$x = $ENV{EDITOR}
. Getan.$x
ist jetzt/bin/vi
wie Sie wollte. Es ist genau das gleiche wie$x = $y
. Gleiche Sache mit dem ZITIEREN.Getan.
Nun, ich vermute, was Sie wirklich wollen, zu tun ist, führen Sie den editor und das Zitat, in einem shell-Befehl. Bin ich im Recht?
Gut, man könnte double-escape-das ZITAT ist Wert, denke ich, da Sie wissen, dass es
eval
ed.Vielleicht, was Sie wollen, ist nicht Perl -
eval
aber zu bewerten, die Umgebungsvariable als würde die Schale. Für diese, die Sie verwenden möchten backticks.echo -n \$QUOTE
;?