Perl的foreach
循环操作符是否需要按顺序呈现列表项?Perl,foreach订单
例如
my @a=(1,2,3);
foreach my $item (@a) {
print $item;
}
将总是打印1 2 3?
我怀疑是这样,但我找不到它记录。
Perl的foreach
循环操作符是否需要按顺序呈现列表项?Perl,foreach订单
例如
my @a=(1,2,3);
foreach my $item (@a) {
print $item;
}
将总是打印1 2 3?
我怀疑是这样,但我找不到它记录。
是的,它会的。数组和列表已订购。
是的,数组保持顺序,而哈希不。
是的。
一些明显的复杂性(数组排列顺序,但哈希不是 - 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()
并遍历结果。
请注意散列中的键的顺序是未定义的并且没有排序。列表总是在他们使用的任何地方排序。 – Daenyth 2010-06-15 16:32:28
不只是未定义,但明确随机在最近版本的Perl增加安全 – 2010-06-15 23:56:18
@Eric我会咬:什么是安全性的关注? – Telemachus 2010-06-16 00:18:04