foreach kann Inhalt eines Arrays nicht mehr verarbeiten
Andreas
- perl
0 Erwin0 Matti Maekitalo
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
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
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);