由于某些原因,我的原始数组被此代码消灭了。我无法弄清楚为什么?运行之后@my_array是空的,我在while循环中取出了所有工作,看看是不是原因,但不是。
foreach (@my_array)
{
open MY_FH, "<", $_;
while (<MY_FH>)
{
}
close MY_FH;
}
答案 0 :(得分:9)
它不是空的,它只是undef
。
while (<MY_FH>)
是while (defined($_ = <MY_FH>))
的语法糖。由于foreach
循环中的变量是原始值的别名,因此$_
中的文件名会被文件的每一行覆盖。 while
循环一直持续到<MY_FH>
返回undef
以指示EOF。 undef
是$_
中存储的最后一个值。
解决方案是在至少一个循环中使用不同的变量。更改foreach
循环可能会减少工作量:
foreach my $fn (@my_array)
{
open MY_FH, "<", $fn;
while (<MY_FH>)
{
}
close MY_FH;
}
如果您在使用@my_array
循环后检查了scalar @my_array
的大小,则会发现它没有更改。但是当你访问单个元素时,undef
数组看起来就像一个空数组,这可能就是为什么你认为它是空的。
答案 1 :(得分:0)
正如cjm所解释的那样,数组的元素被while
循环覆盖,因为它从文件读取到$_
,foreach
依次对每个数组元素进行别名
最简单的解决方案是在$_
循环期间本地化 while
。这会创建$_
的临时副本,可以在不影响@my_array
的情况下使用。喜欢这个
for ( @my_array ) {
open my $fh, '<', $_;
local $_; # To protect @my_array
while ( <$fh> ) {
...
}
close $fh;
}