Michael Staehle: String auswerten oder so aehnlich

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;

Okay, ich weiss dass jetzt "Hallo $name" ausgegeben wird. Ich will aber "Hallo Michael".

Bitte jetzt aber nicht sagen, ' durch " ersetzten und Variablendeklaration umkehren.

Ich will zuerst $test erzeugen und spaeter $name eintragen lassen.

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

Ciao micha

  1. Moin, ich bin zwar kein Perl-Informierter... :-) aber ich würde erst
    mal sagen, daß du deine Variable $name vor deinem 'Hallo $name' definieren musst, und zweitens würde ich sagen
    'Hallo' + $name   alles, was der Rechner in Hochkommas vorfindet denke ich wird als sting intrpretiert... deshalb ging deine Konstruktion  nicht.

    hoffe es hat geholfen,
    Christian

    1. Moin, ich bin zwar kein Perl-Informierter... :-) aber ich würde erst
      mal sagen, daß du deine Variable $name vor deinem 'Hallo $name' definieren musst, und zweitens würde ich sagen
      'Hallo' + $name   alles, was der Rechner in Hochkommas vorfindet denke ich wird als sting intrpretiert... deshalb ging deine Konstruktion  nicht.

      ------> Bitte jetzt aber nicht sagen, ' durch " ersetzten und Variablendeklaration umkehren.

      Ich will die Deklaration extra in dieser Reihenfolge.

      hoffe es hat geholfen,
      Christian

      NEIN

      Ciao Micha

      P.S.  So aehnlich halt:

      $test = 'print "$test";';

      eval( $test );

      Nur soll das Ergebnis nicht auf den Bildschirm sondern in eine andere Variable.

  2. 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

    1. 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

      1. Hallo,

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

        Ich habe das mit Perl 5.6.1 unter Win2k getestet, und es funktionierte. Aber so, wie Du es machst, ist es wahrscheinlich besser;-)

        Grüße
          Klaus

  3. hi!

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

    Übrigens möchtest du deine Variablen vermutlich mit 'my' deklarieren,
    auch wenn du es noch nicht weißt. Und wenn du doch 'local' meinst,
    dann kannst du das sicher auch begründen? :)

    bye, Frank!