Michael Staehle: String auswerten oder so aehnlich

Beitrag lesen

Hallo,

ich habe mal wieder ein kleines Problem. Ich moechte eine Variable in einem String erst spaeter definieren. So wie hier:

local $test = 'Hallo $name';
local $name = "Michael";
print $test;

Wie geht das? Ich habe da an eval gedacht aber es funktioniert nicht.

So spontan sehe ich zwei Möglichkeiten
1.)
local $test = '$test = "Hallo $name";';
local $name = "Michael";
eval $test;
print $test;
Du machst zuerst aus $test eine Anweisung, in der $test gesetzt werden würde, und übergibst das eval. Hat schon fast etwas selbstbezuügliches;-)
Vorteil hier ist, daß es wirklich eine Interpolation ist. Nachteile sehe ich darin, daß erstens der Originaltext von $test nicht der gleiche ist, den Du vorgegeben hast und daß es auch gefährlich sein kann, wenn $test nicht ausschließlich im script selbst definiert wird, sondern von einem File oder noch schlimmer einem HTML-Formular via CGI dem Script übergeben wird. Dann ist eine ziemlich aufwendige Prüfung erforderlich.

Gut kombiniert. Es soll aus einer Datei zur Initialisierung eines Scriptes kommen, in der mann auch Saetze angeben kann. Dadurch ist eine Interpolation notwendig.

2.)
local $test = 'Hallo $name';
local $name = "Michael";
$test =~ s/$(\S+)/$$1/g;
print $test;
mittels Regex(kann gegebenenfalls verfeinert werden) werden alle Vorkommen des Variablennamens gefunden und durch den inhalt der entsprechenden Variable ersetzt.
Vorteil dieser Variante sehe ich darin, daß nur Textersetzungen passieren können, die Angst vor gefährlichem Code alá system oder backticks ist hie rnicht angebracht.
Nachteil ist, daß die Felxibilität der Ersetzungen von Dir kommen muß.

Sehr gut ist eigentlich das was ich suchte.

Sollte $test =~ s/$(\S+)/${$1}/g; heissen, oder? Zumindest gibt Deine Version unter DOS-Perl -912983129 oder so was aus.

Oder funktioniert die erste Version unter Unix?

Pseudocode-Fehler?!?

Performancemäßige Abschätzungen habe ich da jetzt auch nicht gemacht, das dürfte sich aber IMHO ziemlich die Waage halten.

Weiss ich nicht, aber ist auch fuer mich egal.

Aber wie ich bisher Perl erfahren habe, gibt es sicherlich noch ein paar andere, vielleicht elegantere, Varianten.

Sicher scheint mir aber Deine 2. Version zu sein, daher werde ich sie verwenden.

Danke fuer Deinen Tipp.

Ciao Micha

Grüße
  Klaus