Danny: regex problem

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

  1. 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!

    1. 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