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

标签 arrays perl while-loop file-handling

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

2.while ($var = @array){print $var}是怎么回事?设法遍历整个数组?不应该$var只需获取 @array 中的索引数即可并返回该值(因此创建一个无限循环)?

据我了解while()读取语句的条件并循环,只要它发现它为真。不过,令我感到困惑的是它围绕文件句柄、列表等的行为。

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

最佳答案

让我们先看看 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

The number 0, the strings '0' and "" , the empty list () , and undef are all false in a boolean context. All other values are true.

以单行为例:

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

它将打印出数字 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";
}

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

关于arrays - Perl:请向我解释 while() 的以下行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21950535/

相关文章:

regex - 如何访问由递归Perl正则表达式捕获的组?

string - 特定字体中字符串的长度

c - 每当在 C 中调用函数 'main' 时,变量都未初始化

java - while循环中的多个条件

javascript - 如何循环遍历 100 个具有不同属性的对象的数组并从每个对象中检索 1 个属性值?

c - 骰子实验,增加最大 throw 次数

perl - 在 perl 中检测声明的包变量

PHP While 循环搜索多个 MySQL 查询

ios - NSPredicate 使用列表中的任何对象搜索数组 |对象C

c - 将 BST 传递给结构数组