2010-06-15 57 views
11

Perl的foreach循环操作符是否需要按顺序呈现列表项?Perl,foreach订单

例如

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

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

将总是打印1 2 3?

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

回答

14

是的。它按列表顺序进行迭代。只要它被记录,看perldoc perlsyn

超过正常列表值

foreach循环迭代,并把变量VAR 是反过来的列表的每个元素。

“反过来”这里意味着按顺序。

+10

请注意散列中的键的顺序是未定义的并且没有排序。列表总是在他们使用的任何地方排序。 – Daenyth 2010-06-15 16:32:28

+0

不只是未定义,但明确随机在最近版本的Perl增加安全 – 2010-06-15 23:56:18

+0

@Eric我会咬:什么是安全性的关注? – Telemachus 2010-06-16 00:18:04

3

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

3

是的,数组保持顺序,而哈希不。

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()并遍历结果。