regex problem
Danny
- perl
0 Frank Schönmann0 Danny
guten abend,
ich habe folgenden codeblock:
for (@lines) {
if ($_) { ($name, $href) = split(/##/) };
for (@template) {
s/[name]/$name/i;
s/[href]/$href/i;
print;
}
}
im array @lines stehen folgende einträge:
name1##href1
name2##href2
name3##href3
im array @template steht aus testzwecken einfach:
[NAME] [HREF]
als ergebnis solte das script also ausgeben:
name1 href1
name2 href2
name3 href3
das tut es allerdings nicht, stattdessen kommt:
name1 href1
name1 href1
name1 href1
die variable im regulären ausdruck wird also allem anschein nach nicht neu kompiliert...
weiß vielleicht jemand, wie man das erzwingen kann oder was ich noch falsch gemacht haben könnte?
vielen dank....
Danny
hi!
Nach einem Geistesblitz meinerseits jetzt doch noch eine Antwort, da hast du aber Glück gehabt... ;)
for (@template) {
s/[name]/$name/i;
s/[href]/$href/i;
print;
}
[...]
im array @template steht aus testzwecken einfach:
[NAME] [HREF]
[...]
die variable im regulären ausdruck wird also allem anschein nach nicht neu kompiliert...
It's not a bug, it's a feature :)
In obigem Code-Block wird @template Zeile für Zeile durchgegangen. Durch s/// veränderst du die Variable
$_, was aber direkte Auswirkungen auf das Array @template hat. Wir hatten hier irgendwann vor kurzem
auch mal einen Thread dazu (IMHO). Im Endeffekt steht also in @template nach dem ersten Durchlauf nur
noch "name1 href1", da die Template-Makros ersetzt wurden.
Siehe dazu auch perlfaq4: http://www.perl.com/pub/doc/manual/html/pod/perlfaq4.html#How_do_I_process_modify_each_ele
Ich würde ungefähr folgendes vorschlagen:
for (@template)
{
my $tmp = $_;
$tmp =~ s/[name]/$name/i;
$tmp =~ s/[href]/$href/i;
print $tmp;
}
Bei "for my $tmp (@template) {..}" tritt übrigens der gleiche Effekt auf, wenn du $tmp veränderst, das hängt
also nicht direkt mit der Spezialvariablen $_ zusammen.
bye, Frank!
danke für die schnelle antwort :)
funktioniert perfekt.
jetzt muss ich nur nochmal darüber nachsinnen wofür dieses "feature" gut ist :)
vielleicht hilft mir ja dazu dein link noch weiter.
vielen dank nochmal!
Danny