让我们从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
在布尔上下文中都是错误的。所有其他值都为真。
以这条单线为例:
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,听起来你得到了不同的结果,但这对我来说确实陷入了一个循环。