在foreach内部杀死原始数组

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)

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

如果你检查@my_array循环后的大小scalar @my_array,你会发现它没有改变.但是undef当你访问单个元素时,一组外观就像一个空数组,这可能就是为什么你认为它是空的.

  • @ToddIglehart,欢迎您,但如果这个答案解决了您的问题,您应该考虑[将其标记为已接受](http://stackoverflow.com/help/someone-answers). (2认同)