Perl:请向我解释while()的以下行为

时间:2014-02-22 06:13:58

标签: arrays perl while-loop file-handling

1.为什么while (<$filehandle>)无法迭代遍历文件,但它不会在不操纵数组本身的情况下迭代列表或数组(比如使用while ($_ = shift @array){print $_}?这是怎么发生的?

2. while ($var = @array){print $var}如何设法迭代整个数组?不应该$var只获取@array中的索引数并返回该值(因此创建一个无限循环)?

从我的理解while()读取语句的条件性并循环,只要它发现它是真的。我觉得令人困惑的是它在文件句柄,列表等方面的行为。

请帮助我了解有关while()的更多信息,因为我发现此操作符有时令人困惑。

2 个答案:

答案 0 :(得分:6)

让我们先来看看while(<$filehandle>)。这实际上是Perl的简写:

while (defined($_ = <$filehandle>)) {
    print $_;
}

所以每次循环时,你都在读取文件中的下一行,如果没有定义,你将退出循环。如果已定义,您将继续。正如您所期望的那样,只要条件的计算结果为真,while就会循环。

通过运行perl -MO=Deparse program.pl,您将能够看到这一点。您还可以查看Loop Control下的文档。菱形运算符与子例程readline相同(它从文件中读取下一行)。


对于while ($_ = shift @array){print $_},在检查while循环的条件时,您将修改数组。子例程shift删除数组的第一个元素并返回它。因此$_将被正确设置,但您的数组将开始丢失元素。


在下一种情况下,while ($var = @array){print $var}$var将等于数组中元素的数量。这是因为你在标量上下文中使用@array。由于perlsyn

,这很可能会评估为真
  

数字0,字符串'0'和“”,空列表()和undef   在布尔上下文中都是false。所有其他值都是真的。

以单行为例:

perl -le 'my @array = qw(a b c d e); my $var = @array; print $var'

它将打印数字5,因为数组中有5个元素。如果数组中有0个元素,则while循环将不会执行,如果其中包含1个或更多元素,它将被卡在无限循环中。

示例:

### This code will print 5 forever ###
my @array = qw(hi this is a test);
my $var;
while ( $var =  @array ) {
    print "$var\n";
}

对于你的问题2,听起来你得到了不同的结果,但这确实让我陷入困境。

答案 1 :(得分:0)

如果您打算使用Perl,您必须对特殊情况感到满意。

在第一种情况下,特殊的是钻石操作员(&lt;&gt;)。

小心2,因为它会打破假值,IIRC。