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

ste*_*key 3 arrays perl file-handling while-loop

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

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

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

请帮我理解更多,while()因为我发现这个操作员有时会很困惑.

hma*_*tt1 6

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

while (defined($_ = <$filehandle>)) {
    print $_;
}
Run Code Online (Sandbox Code Playgroud)

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

你可以通过跑步看到它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'
Run Code Online (Sandbox Code Playgroud)

它将打印数字5,因为数组中有5个元素.的while,如果你有你的数组中的元素0循环将不会执行,它会停留在一个无限循环如果在这1个或多个元素.

例:

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

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

  • 附加信息:数组的非破坏性迭代由`for`提供. (2认同)