D
dummschnigger
Grünschnabel
Hallo alle zusammen,
ich habe ein Problem mit Regex in einem Perlscript. Ich möchte eine Templatedatei einlesen, bestimmte Werte ersetzen und die Daten danach in eine neue Datei schreiben. Einlesen und Ausgabe funzt. Ich lese die Datei komplett in einen String ein und bearbeite diesen dann mit einem regulären Ausdruck. In einer Steuerdatei stehen die ganzen Werte sowie die Ersetzungen drin.
Folgende Variablen habe ich:
Script:
Das steht dann in den Variablen drin:
Meine Templatedatei sieht so aus
Es soll jetzt nach allen Werten in @replace_titles gesucht werden, die sich in einer doppelt geschweiften Klammer befinden und ersetzt werden.
Wenn ich das Script laufen lasse, dann bekomme ich mit dem "print $tmp_tpl;" nur den Inhalt der Templatedatei angezeigt, ohne dass die Veränderungen vorgenommen werden.
Wo ist mein Fehler? Ich schätze mal, dass irgendwas mit dem Ausdruck nicht stimmt, wahrscheinlich mit den Parametern hintendran.
Ich wäre für jegliche Hilfe dankbar.
/edit:
Die Suchwörter können auch mehrfach vorkommen und dann sollten alle auch ersetzt werden, z.B.:
/edit2:
ich habe gerade mal folgendes getestet:
Wenn ich das so ausführe, wird das einwandfrei ersetzt. Anscheinend hängt es damit zusammen, wie ich den Ausdruck aufbaue.
Wenn ich den Ausdruck so aufbaue:
dann bringt er mir diese Fehlermeldung:
Irgendjemand 'ne Idee wie ich meine Variablen da rein bekomme?
ich habe ein Problem mit Regex in einem Perlscript. Ich möchte eine Templatedatei einlesen, bestimmte Werte ersetzen und die Daten danach in eine neue Datei schreiben. Einlesen und Ausgabe funzt. Ich lese die Datei komplett in einen String ein und bearbeite diesen dann mit einem regulären Ausdruck. In einer Steuerdatei stehen die ganzen Werte sowie die Ersetzungen drin.
Code:
host|ip
test1|192.168.1.1
test2|192.168.1.2
Code:
$tpl -> die Templatedatei
@replace_titles -> Die Werte die gesucht werden sollen
@tmp_cfg -> Die Werte die dann eingefügt werden sollen
Code:
foreach my $line (@tmp_cfg) {
my $tmp_tpl = $tpl;
chomp($line);
my @replace = split(/\|/, $line);
for(my $c = 0; $c <= $#replace; $c++) {
my $regex = 's/\{\{' . $replace_titles[$c] . '\}\}/' . $replace[$c] . '/egimox';
$tmp_tpl =~ $regex;
}
print $tmp_tpl;
}
Code:
@replace_titles[0] = 'host'
@replace_titles[1] = 'ip'
...
@tmp_cfg[0] = 'test1|192.168.1.1'
@tmp_cfg[1] = 'test2|192.168.1.2'
...
@replace[0] = 'test1'
@replace[1] = '192.168.1.1'
Code:
Hostname {{host}}
IP-Add {{ip}}
Wenn ich das Script laufen lasse, dann bekomme ich mit dem "print $tmp_tpl;" nur den Inhalt der Templatedatei angezeigt, ohne dass die Veränderungen vorgenommen werden.
Wo ist mein Fehler? Ich schätze mal, dass irgendwas mit dem Ausdruck nicht stimmt, wahrscheinlich mit den Parametern hintendran.
Ich wäre für jegliche Hilfe dankbar.
/edit:
Die Suchwörter können auch mehrfach vorkommen und dann sollten alle auch ersetzt werden, z.B.:
Code:
Hostname {{host}}
IP-Add {{ip}}
Irgendwas {{host}}
/edit2:
ich habe gerade mal folgendes getestet:
Code:
$tmp_tpl =~ s/{{hostname}}/test1/g;
Wenn ich das so ausführe, wird das einwandfrei ersetzt. Anscheinend hängt es damit zusammen, wie ich den Ausdruck aufbaue.
Wenn ich den Ausdruck so aufbaue:
Code:
my $regex = s/\{\{$replace_titles[$c]\}\}/$replace[$c]/g;
Code:
Use of uninitialized value in substitution (s///) at ./create_cfg.pl line 112.
Zuletzt bearbeitet: