我在遍历文件名时遇到问题,我的输入数组元素被删除了。
代码:
Headings
输出:
use Data::Dumper;
use warnings;
use strict;
my @files = ("file1", "file2", "file3");
print Dumper(\@files);
for (@files) {
my $filename = $_ . '.txt';
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' $!";
while(<$fh>) {
print "$filename read line \n";
}
}
print Dumper(\@files);
文件内容:
$VAR1 = [
'file1',
'file2',
'file3'
];
file1.txt read line
file2.txt read line
file3.txt read line
$VAR1 = [
undef,
undef,
undef
];
为什么删除数组内容? (对于该问题,我有2种不同的解决方法,但我想了解这段代码有什么问题。)
答案 0 :(得分:7)
while (<$fh>)
是
的缩写while ($_ = <$fh>)
因此您正在破坏$_
的别名,别名为@files
。您需要按以下方式保护$_
:
while (local $_ = <$fh>)
更好的是,使用其他变量名称。
while (my $line = <$fh>)
答案 1 :(得分:4)
您正在循环内以两种不同的方式使用$_
(作为当前文件名和作为当前行),它们正在相互干扰。不要这样命名您的变量,例如:
for my $file (@files) {
...
while(my $line = <$fh>) {
...
}
}
您可以想象您的当前代码在读取每个文件后会执行此操作:
for (@files) {
undef $_;
}