Perl seems to be killing my array whenever I read a file:
my @files = ("foo", "bar", "baz");
print "Files: " . join(" ", @files) . "\n";
foreach(@files) {
print "The file is $_\n";
func();
}
sub func {
open(READ, "< test.txt");
while(<READ>) {
}
close READ;
}
print "Files: " . join(" ", @files) . "\n";
produces:
Files: foo bar baz
The file is foo
The file is bar
The file is baz
Files:
but when I comment out func()
, it gives what I would've expected:
Files: foo bar baz
The file is foo
The file is bar
The file is baz
Files: foo bar baz
Any ideas why this might be happening?
You have to change foo
to localize $_
, or not to use $_
in your loop. Best yet, do both:
foreach my $filename (@files) {
print "The file is $filename\n";
func();
}
sub func {
local $_;
open my $read, '<', 'test.txt' or die "Couldn't open test.txt: $!";
while(<$read>) {
}
close $read or die "Couldn't close file: $!";
}
The foreach loop aliases $_
to the current name of the file and the while(<READ>)
assigns to $_
. That's a bad combination of magic, so to say.
In general, it's a bad idea to rely on much on $_
for anything other than a one-liner.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With