2012-03-27 3 views
0

In einem Perl-Skript, mag ich Speichergruppe spezielle Variable in einer Stringvariablen bewerten:Wie eval Speichergruppe in einer Variablen mit Perl?

my $string="3-4"; 
my $cal='first is $1;second is $2'; 
my $regex='^(.)-(.)$'; 

if($string=~ $regex){ 
    print $cal; 
     #print "first is $1;second is $2"; 
} 

I drucken mag: "first 3 ist, und zweitens 4" (wie in zweitem Druck).

In meinem Beispiel gibt es nur 2 spezielle Variablen, aber die Anzahl der Sonderzeichen kann nicht im Voraus bestimmt werden, da $cal und $regex in einer Datenbank gespeichert sind.

Wie kann ich die Zeichenfolge $cal (wie mit Eval in PHP) bewerten?

Antwort

0
print eval "\"$cal\"","\n"; 

Die äußeren dblquotes sind für eval " ", die inneren maskierten Angebote sind für die Interpolation innerhalb print "$1 $2","\n";

oder Sie können die Drucksegmente wie diese print eval "\"$cal\n\"";

kombinieren
+0

Vielen Dank SLN. Es funktioniert perfekt! – user1296757

1

Klingt, als ob Sie ein Muster definieren möchten, in das Ihre Übereinstimmungen eingefügt werden? Sie könnten dafür printf verwenden, z.B.

my $string="3-4"; 
my $cal="%s %s\n"; 
if($string=~ '^(.)-(.)$'){ 
    printf($cal, $1, $2); 
} 

Wenn Sie wollen einfach alle Spiele miteinander verbinden, und Sie wissen nicht, wie viele es auch sein mag, versuchen so etwas wie dieses

my @matches=$string=~ '^(.)-(.)$'; 
if (scalar(@matches)) 
{ 
    print join(' ',@matches); 
} 
+0

Danke Paul aber der zweite Druck macht das schon. – user1296757

+0

Ich dachte, das war deine Frage - wie man den ersten Druck macht, was der zweite tut. Ich habe meine Antwort bearbeitet, um zu verdeutlichen, wie sie sich auf Ihr Original bezieht - das 'Muster', dem die Ausgabe folgen soll, ist in $ cal –

+0

Ich verstehe Ihre Antwort, aber ich kann nicht im Voraus wissen, wie viele Sondervariablen es können Verwendung in $ cal – user1296757

Verwandte Themen