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

Posted

技术标签:

【中文标题】Perl:请向我解释一下 while() 的以下行为【英文标题】:Perl: Please explain to me the following behaviours of while() 【发布时间】:2014-03-23 22:02:16 【问题描述】:

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

2.while ($var = @array)print $var 是如何遍历整个数组的? $var 不应该只获取@array 中的索引数量并返回该值(因此创建一个无限循环)吗?

据我了解,while() 读取语句的条件,只要它发现它为真,就会循环。我发现令人困惑的是它在文件句柄、列表等方面的行为。

请帮助我了解更多关于 while() 的信息,因为我有时会发现这个运算符非常令人困惑。

【问题讨论】:

【参考方案1】:

让我们从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,听起来你得到了不同的结果,但这对我来说确实陷入了一个循环。

【讨论】:

附加信息:数组的无损迭代由for提供。【参考方案2】:

如果您打算使用 Perl,则必须熟悉特殊情况。

在第一种情况下,特殊的是菱形运算符()。

小心 2,因为它会破坏错误值,IIRC。

【讨论】:

以上是关于Perl:请向我解释一下 while() 的以下行为的主要内容,如果未能解决你的问题,请参考以下文章

请向我解释以下自动布局行为

请向我解释错误的性质:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序

请向我解释 AWS 服务每 GB IN 带宽 0.00 美元的定价

如何在表格行上添加边距

请向 vb-er 解释 C# 语法

ExpressionChangedAfterItHasBeenCheckedError 解释