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
Hi, Pattern: /\<(.*?)\>/ Würde aus x = <$TEST>, x = 123 ergeben. Oder verstehe ich dein Problem falsch? $ musst du mit \\ escapen, da $ für das Ende des Strings steht.
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.