[Perl Regex] Probleme mit $ beim ersetzen
-
Folgendes Szenario: ich hab eine Templatedatei, wo Platzhalter in der Form $PLATZHALTER drinstehen. Diese Platzhalter sollen mit einem Perl-Script durch konkrete Werte ersetzt werden, die in einem hash stehen, dessen Keys die Platzhalter sind. Beispiel:
Template:
$ARTIKEL $TIER macht $GERAEUSCH.
Perl-hash:
my %hash = (); $hash{'$ARTIKEL'} = "Die"; $hash{'$TIER'} = "Kuh"; $hash{'$GERAEUSCH'} = "muh";
klingt soweit ganz simpel, jedoch komm ich mit dem Ersetzen nicht zurecht:
my $line = '$ARTIKEL $TIER macht $GERAEUSCH.'; foreach (keys %hash) { $line =~ s/$_/$hash{$_}/; #sollte eigentlich alle keys mit dem zugeh. value ersetzen }
wie gesagt, sollte...
Tut aber nicht. Normales matching funktioniert auch nicht. Ich hab sowohl die Zeile als auch den hash schon komplett ausgegeben, sind korrekt befüllt. Woran kanns liegen?
Weiß jemand ne Lösung?
-
Ich vermute mal, daß perl die Platzhalter mit dem $ versucht zu interpretieren.
Versuch' doch einfach mal, den Platzhalter z. B. %%TIER%% zu nennen, statt $TIER. Wenn es damit funktioniert, dann war meine Vermutung richtig.
-
nope:
use strict; my %hash = (); $hash{'%%ARTIKEL%%'} = "Die"; $hash{'%%TIER%%'} = "Kuh"; $hash{'%%GERAEUSCH%%'} = "muh"; my $line = '%%ARTIKEL%% %%TIER%% macht %%GERAEUSCH%%.'; foreach (keys %hash) { "\$line =~ s/$_/$hash{$_}/g"; #sollte eigentlich alle keys mit dem zugeh. value ersetzen } print $line;
ergibt:
%%ARTIKEL%% %%TIER%% macht %%GERAEUSCH%%.
Ich hab jetzt ne eigene replace_string-Funktion geschrieben, mit der tuts. Wurmt mich aber trotzdem...
-
use strict; my %hash = (); $hash{'%%ARTIKEL%%'} = "Die"; $hash{'%%TIER%%'} = "Kuh"; $hash{'%%GERAEUSCH%%'} = "muh"; my $line = '%%ARTIKEL%% %%TIER%% macht %%GERAEUSCH%%.'; foreach (keys %hash) { $line =~ s/$_/$hash{$_}/g; } print $line;
=> Die Kuh macht muh.
-
rüdiger schrieb:
print $line;
=> Die Kuh macht muh.
Stimmt hatte vergessen die "" wieder zu löschen nach einigem Rumprobieren.
Gesetzt den Fall die Keys sind vorgeben und fangen mit dem $ an - weiß jemand Rat, wie man das in die regex reinbekommt?
-
Habe ich jetzt nicht getestet, aber versuch' mal folgendes:
use strict; my %hash = (); $hash{'$ARTIKEL'} = "Die"; $hash{'$TIER'} = "Kuh"; $hash{'$GERAEUSCH'} = "muh"; my $line = '$ARTIKEL $TIER macht $GERAEUSCH.'; foreach my $key (keys %hash) { my $key_ersetz = '\\' . $key; $line =~ s/$key_ersetz/$hash{$key}/g; } print $line;
Dies sollte das $-Zeichen ausmaskieren, daß bei einem RegExp für das Zeilenende steht.
-
Man muss hierbei beachten, dass das $ ein Sonderzeichen in Regulären Ausdrücken ist. Deshalb muss es gequotet werden:
my $line = '$ARTIKEL $TIER macht $GERAEUSCH.'; foreach (keys %hash) { $line =~ s/\Q$_/$hash{$_}/; }