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.
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ß.
Performancemäßige Abschätzungen habe ich da jetzt auch nicht gemacht, das dürfte sich aber IMHO ziemlich die Waage halten.
Aber wie ich bisher Perl erfahren habe, gibt es sicherlich noch ein paar andere, vielleicht elegantere, Varianten.
Grüße
Klaus