循环文件时删除数组元素

时间:2019-04-15 13:56:46

标签: loops perl file-handling

我在遍历文件名时遇到问题,我的输入数组元素被删除了。

代码:

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种不同的解决方法,但我想了解这段代码有什么问题。)

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 $_;
}