Tod*_*art 0 perl foreach while-loop
由于某种原因,我的原始数组被这个代码消灭了.我想不通为什么?运行之后@my_array是空的,我在while循环中取出了所有的工作,看看是不是原因,但事实并非如此.
foreach (@my_array)
{
open MY_FH, "<", $_;
while (<MY_FH>)
{
}
close MY_FH;
}
Run Code Online (Sandbox Code Playgroud)
它不是空的,它只是满满的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;
}
Run Code Online (Sandbox Code Playgroud)
如果你检查@my_array循环后的大小scalar @my_array,你会发现它没有改变.但是undef当你访问单个元素时,一组外观就像一个空数组,这可能就是为什么你认为它是空的.