Perl的foreach
循环运算符是否要求按顺序显示列表项?
例如
my @a=(1,2,3);
foreach my $item (@a) {
print $item;
}
将始终打印1 2 3?
我怀疑是这样,但我找不到记录。
答案 0 :(得分:14)
答案 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)
是的,数组保留顺序,而哈希则没有。