Frank Schönmann: regex problem

Beitrag lesen

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!