在文件句柄中的while循环之后,数组被刷新

时间:2014-12-11 18:51:15

标签: arrays perl filehandle

我遇到了Perl脚本的问题。

以下是代码:

use strict;
use Data::Dumper;

my @data = ('a','b');

if(@data){
  for(@data){
    &debug_check($_)
  }
}

print "@data";#Nothing is printed, the array gets empty after the while loop.

sub debug_check{
  my $ip = shift;
  open my $fh, "<", "debug.txt";
  while(<$fh>){
    print "$_ $ip\n";
  }
}

在此示例中,数组数据有两个元素。我需要检查数组是否有元素。如果有,则为每个元素调用一个子例程,在本例中称为&#34; debug_check&#34;。在子程序内部,我需要打开一个文件来读取一些数据。使用while循环读取文件后,数据数组变空。

为什么要刷新数组,如何避免这种奇怪的行为?

感谢。

2 个答案:

答案 0 :(得分:1)

我认为这里的问题将归结为$_。这是一个特殊情况,因为它是一个值的别名。如果在循环中修改$_,它将更新数组。因此,当您将其交给子例程,然后shift时,它也会更新@data

尝试:

my ( $ip ) = @_; 

或者改为:

for my $ip ( @array ) { 
     debug_check($ip);
}

注意 - 您还应该避免对子使用&前缀。它有特殊的意义。通常它会起作用,但它通常是冗余的,并且可能会引起一些奇怪的故障。

答案 1 :(得分:1)

while (<$fh>)

的缩写
while (defined($_ = <$fh>))

$_目前已归为@data元素的别名,因此您的子资源正在用@data替换undef的每个元素。修正:

while (local $_ = <$fh>)

的缩写
while (defined(local $_ = <$fh>))

while (my $line = <$fh>)   # And use $line instead of $_ afterwards

的缩写
while (defined(my $line = <$fh>))

使用全局变量时要小心。如果修改它们,您希望对它们进行本地化。