Theo: doppelt interpolieren?

Hallo,
folgendes Problem: ich möchte mit zwei Eingaben in einem String suchen und einen neu daraus zusammengesetzen ausgeben.

my $String = "abcdef 1234 xyz";
my $Search = "(\w+)(\d+)(\w+)";
my $NewOrder = "$3 $2 $1";

$Search und $NewOrder sind eigentlich variabel und werden von einer Eingabe eingelesen

if ($String =~ /$Search/) {
  print "$3 $2 $1";  # diese Zeile führt zum gewünschten Ergebnis
  print "$NewOrder";  # diese nicht
};

$NewOrder soll nicht fix sein, sondern von einer Eingabe stammen.
Wie bringe ich Perl dazu, mir die veränderte Reihenfolge auszugeben?
Mit einfachen oder doppelten Anführungszeichen oder q oder qq oder $ etc. bin ich nicht zum Ziel gekommen.
Wie kann ich "doppelt interpolieren"? Oder muss ich das ganze völlig anders konstruieren?
Danke für Hinweise.

  1. Hi,

    my $String = "abcdef 1234 xyz";
    my $Search = "(\w+)(\d+)(\w+)";
    my $NewOrder = "$3 $2 $1";

    $NewOrder wird in *diesem* Moment gefüllt, also $1, $2 und $3 werden *jetzt* ersetzt. Anschließend existieren sie nicht mehr.

    print "$3 $2 $1";  # diese Zeile führt zum gewünschten Ergebnis
      print "$NewOrder";  # diese nicht

    Welche Magie sollte hier dafür sorgen, dass eventuelle in der Variable enthaltene Variablenbezeichnungen ersetzt werden?

    Wie bringe ich Perl dazu, mir die veränderte Reihenfolge auszugeben?

    Suche ein passendes Konzept, beispielsweise auf Basis von sprintf().

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hi

    Wie kann ich "doppelt interpolieren"? Oder muss ich das ganze völlig anders konstruieren?

    Mit "eval" sollte es gehen, aber wenn da fremder Code drinsteht würde ich die Finger davon lasen.

    So long
     LanX

    1. Hi LanX,

      Mit "eval" sollte es gehen, aber wenn da fremder Code drinsteht würde ich die Finger davon lasen.

      Danke! Das macht genau den Job! Danke auch für den Sicherheitshinweis.
      Keine Sorge, da steht nur mein (gutartiger) Umsortier-Code drin (z.B. "$1,$3.txt\t$2 abcde $1" oder sonstiges, aber keine Befehle, die zur Ausführung kommen (sollen)).
      Aber könnte man bösartigen Code irgendwie abfangen?

      1. Hi

        Aber könnte man bösartigen Code irgendwie abfangen?

        naja du kannst nen Parser bauen der deinen String abweist wenn er nicht deinen Validitätskriterien genügt, das ist in perl aber nicht trivial, weil du z.B. in Perl selbst Stringinterpolationen Code inschmuggeln und evaluieren kannst. Sowas würde den Aufwand nicht lohnen, es sei denn es bliebe wirklich nur bei einer Regex die ausschließlich "$\d+" erlaubt.

        Außerdem hab ich ein Modul "safe" gesehen um eine restriktierte Umgebung zu bauen, aber keine eigenen Erfahrungen gesammelt.

        So long
          LanX