[Perl] regex eval

#2497524
Lesenswert?

hi, ich brauch mal einen Tip:

ich habe eine Zeichenkette die spezielle Muster mit Variablennamen 
enthält.
diese möchte ich durch den WERT der Perl-variablen ersetzen.

Bsp:

my $TEST = 5;
my $sampleText ="x = <\$TEST>\n";
# ...
print $sampleText;


ausgegeben werden soll:
x = 5

versucht habe ich es mit:

$sampleText =~ s/\<(.*?)\>/\1/eg;
da wird statt 5 eine Scalarreferenz ausgegeben.
dereferenziere ich diese mit:
$sampleText =~ s/\<(.*?)\>/${\1}/eg;
 wird ausgegeben
x = 1

hat jemand einen Tip warum und wie es richtig geht?

im nächsten Schritt will ich das $-Zeichen aus dem template-Text haben
also

my $TEST = 5;
my $sampleText ="x = <TEST>\n";
$sampleText =~ s/\<(.*?)\>/${\$\1}/eg;
print $sampleText;

hier habe ich das Problem, dass der reguläre ausdruck, bzw die 
Evaluation des Ersetzugnsstrings abbricht. Ich schaff es nicht das $ 
Zeichen, was ja dem gefunden String vorangestellt werden muss zu 
escapen.
Hier wäre ich auch für einen Hinweis dankbar.


Gruß
Vlad
#2497664
Lesenswert?

Archie F..... schrieb:
> Pattern: /\<(.*?)\>/ Würde aus x = <$TEST>, x = 123 ergeben.
wiso?
das Pattern matcht auf <$TEST> und liefert in \1 den String "$TEST"

dieser soll zu dem Variableinhalt evaluiert werden. und das ganze 
gematchte pattern ersetzen
So dass x = 5 rauskommt.

quasi:
$sampleText =~ /\<(.*?)\>/;
my $temp = eval($1);
$sampleText =~ s/\<.*?\>/$temp/;
in einem Rutsch.

Da das ganze beliebig oft in meinem Inputstring vorkommen kann muss das 
in einem Rutsch passieren, da sonst auch noch in einer Schleife gemacht 
werden muss.
quasi:

while($sampleText =~ /\<(.*?)\>/)
{
  my $temp = eval($1);
  $sampleText =~ s/\<.*?\>/$temp/;
}



> Oder
> verstehe ich dein Problem falsch?
Ich glaube schon


Archie F..... schrieb:
> $ musst du mit \\ escapen, da $ für das Ende des Strings steht.

im pattern selbst, aber doch nicht im zu durchsuchenden Text, oder 
beziehst du dich auf mein 2. Problem?

mit 2 back slashes hab ich es in der Tat noch nicht probiert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren