Andreas: foreach kann Inhalt eines Arrays nicht mehr verarbeiten

Hi,

probiert mal folgendes Script "test.pl" aus:

<CUT>
#!/usr/bin/perl
@dummy=(1,2,3);
foreach(@dummy){
  &dateilesen;
}
foreach(@dummy){
  print "$_\n";
}
sub dateilesen(){
  $dummy="";
  open(FILE,"<test.pl");
  while(<FILE>){
    $dummy.=$_;
  }
  close(FILE);
}
</CUT>

Eigentlich sollte dieses Script

<CUT>
1
2
3
</CUT>

ausgeben. Aber es gibt nichts aus - warum nur!? Das Array ist während der ersten foreach-Schleife laut

<CUT>
...
print @dummy-1."\n";
...
</CUT>

nicht gelöscht worden, trotzdem kann eine weitere foreach-Schleife die Elemente von @dummy nicht mehr verarbeiten. Mein zweiter Versuch mit einer geänderten zweiten foreach-Schleife lief auch nicht besser:

<CUT>
...
foreach $dummy(@dummy){
  print "$dummy\n";
}
...
</CUT>

Seltsam, oder? Es ist übrigens egal, welche Namen ich den verwendeten Variablen gebe, es kommt immer das Selbe heraus... Hat das vielleicht irgendwas mit <FILE> zu tun?

Ciao
Andreas

  1. Hi,

    use strict;

    Warum?

    Siehe : http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?display=11&id=3

    probiert mal folgendes Script "test.pl" aus:

    <CUT>
    #!/usr/bin/perl
    @dummy=(1,2,3);
    foreach(@dummy){
      &dateilesen;
    }

    Die funktion dateilesen() setzt jedes Listenelement der Liste @dummy auf

    $dummy = "";

    /Rolf

    --
    SELFforum - Das Tor zur Welt!
    Theoretiker: Wie kommt das Kupfer in die Leitung?
    Praktiker: Wie kommt der Strom in die Leitung?
  2. use Mosche;

    @dummy=(1,2,3);
    foreach(@dummy){
      &dateilesen;
    }

    Diese Konstruktion bewirkt, daß keine Kopie von den Elementen von @dummy angelegt wird, sondern die einzelnen Elemente direkt bearbeitet werden. Durch das iterieren über <FILE> (die while-Schleife) wird $_, also dein Array-Element, jeweils überschrieben. Außerdem ist $_ am Ende der while-Schleife leer (weil $_ damit ein falscher Ausdruck ist, der while beendet), und damit wird das aktuelle Array-Element leer sein. Abhilfe schafft ein
    local $_ am Beginn der Prozedur dateilesen.

    Noch etwas: Wenn du nicht wirklich weißt, was es bedeutet, dann rufe Prozeduren mit dateilesen() statt @dateilesen auf.

    use Tschoe qw(Matti);

    --
      Anyone who quotes me in their sig is an idiot. -- Rusty Russell.