我遇到了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循环读取文件后,数据数组变空。
为什么要刷新数组,如何避免这种奇怪的行为?
感谢。
答案 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>))
使用全局变量时要小心。如果修改它们,您希望对它们进行本地化。