在foreach内部杀死原始数组

时间:2015-07-09 14:37:56

标签: perl foreach while-loop

由于某些原因,我的原始数组被此代码消灭了。我无法弄清楚为什么?运行之后@my_array是空的,我在while循环中取出了所有工作,看看是不是原因,但不是。

foreach (@my_array)
{
    open MY_FH, "<", $_;
    while (<MY_FH>)
        {
        }
    close MY_FH;
}

2 个答案:

答案 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;
}