Perl,foreach命令

时间:2010-06-15 16:10:48

标签: perl foreach

Perl的foreach循环运算符是否要求按顺序显示列表项?

例如

my @a=(1,2,3);

foreach my $item (@a) {
 print $item;
}

将始终打印1 2 3?

我怀疑是这样,但我找不到记录。

4 个答案:

答案 0 :(得分:14)

是。它按列表顺序迭代。就记录而言,请查看perldoc perlsyn

  

foreach循环遍历正常列表值并设置变量VAR   依次成为列表中的每个元素。

“反过来”这里的意思是顺序。

答案 1 :(得分:7)

是。

一些明显的复杂性(数组是有序的,但哈希不是 - WTF?)来自这样一个事实,即大多数答案忽略了上下文的重要性。

Perl变量,函数,运算符和子例程可根据上下文计算为不同的值。上下文可以是标量列表

在标量上下文中,我们只需要一个值。例如,my $count = @array;@array中的元素数量分配给$count,因为对标量的赋值会提供标量上下文。

在列表上下文中,我们正在寻找多个值。例如,my @merged = @left, @right;。对数组的赋值提供了列表上下文,因此@left@right被扩展为其元素列表。由于列表是扁平结构,因此我们有一个长列表,它结合了两个数组的元素。最后,值列表分配给@merged

大多数答案都掩盖了这一点的原因是,即使上下文一开始看起来很奇怪,但99%的时间背景都是透明的,并且能够达到预期的效果。

for循环提供列表上下文。这意味着括号内的任何内容都在列表上下文中解释。然后按顺序迭代生成的列表。

这意味着:

  • for (@array) {}将数组扩展为元素列表,保留数组的顺序。
  • for (%hash) {}将哈希扩展为随机排序的键/值对列表。
  • for ( <FILEHANDLE> ) {}读取文件句柄中的所有可用行并按顺序显示它们。
  • for ( some_subroutine() ) {}评估列表上下文中的some_subroutine()并迭代结果。

答案 2 :(得分:3)

是的,它会的。订购数组和列表。

答案 3 :(得分:3)

是的,数组保留顺序,而哈希则没有。