Perl,foreach命令

Mik*_*ike 11 perl foreach

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设置为列表的每个元素.

"反过来"这里的意思是顺序.

  • 还要注意哈希中键的顺序是未定义的而不是有序的.列表总是在他们使用的任何地方订购. (11认同)

dao*_*oad 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()在对结果列表环境和迭代.