循环文件时删除数组元素

gme*_*zos 5 perl loops file-handling

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

码:

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);
Run Code Online (Sandbox Code Playgroud)

输出:

$VAR1 = [
          'file1',
          'file2',
          'file3'
        ];
file1.txt read line
file2.txt read line
file3.txt read line
$VAR1 = [
          undef,
          undef,
          undef
        ];
Run Code Online (Sandbox Code Playgroud)

文件内容:

 cat file1.txt
asdfsdfs
 cat file2.txt
iasdfasdsf
 cat file3.txt
sadflkjasdlfj
Run Code Online (Sandbox Code Playgroud)

为什么数组内容被删除?(对于该问题,我有2种不同的解决方法,但是我想了解这段代码有什么问题。)

ike*_*ami 7

while (<$fh>)
Run Code Online (Sandbox Code Playgroud)

是短的

while ($_ = <$fh>)
Run Code Online (Sandbox Code Playgroud)

因此,您正在$_为别名的元素而烦恼@files。您需要进行以下保护$_

while (local $_ = <$fh>)
Run Code Online (Sandbox Code Playgroud)

更好的是,使用其他变量名。

while (my $line = <$fh>)
Run Code Online (Sandbox Code Playgroud)