Perl的foreach循环运算符是否要求按顺序显示列表项?
例如
my @a=(1,2,3);
foreach my $item (@a) {
print $item;
}
Run Code Online (Sandbox Code Playgroud)
将始终打印1 2 3?
我怀疑是这样,但我找不到记录.
DVK*_*DVK 14
是.它按列表顺序迭代.就记录而言,请看perldoc perlsyn:
foreach循环遍历正常列表值,并依次将变量VAR设置为列表的每个元素.
"反过来"这里的意思是顺序.
是.
一些明显的复杂性(数组是有序的,但哈希不是 - 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()在对结果列表环境和迭代.