使用哪种 for
循环来计数整数的参数是什么?
for my $i (0..$n) { ... }
for (my $i = 0; $i <= $n; $i++) { ... }
在你的情况下,没有任何区别。
在其他用例中,在 for-each 循环中,您无法控制或访问迭代器。
使用你的示例语法:
for my $i (0..10)
{
print "$i";
$i++;
}
上述实际上创建了一个foreach
循环 - 它等同于说foreach my $i (0..10)
。 $i
是来自列表的值,而不是迭代器。 迭代器是内部的,您无法访问它; 您无法控制循环的流程。
上面的输出将打印012345678910
。
这个:
for ( my $i = 0; $i++ ; $i <= 10)
{
print $i;
$i++;
}
这是一个真正的 for
循环。您可以控制并输出迭代器。它将输出:0246810
另外:
当您使用 for (1..$n)
时,您正在调用范围运算符,而不是在循环顶部执行简单的比较。然而,性能差异是微不足道的。
for
和 foreach
是同义词。它们之间从来没有任何区别(除了可读性)。 - Ted Hoppforeach (my $i = 0; $i < 5; ++$i) { print "$i\n"; }
运行得非常好。 - Ted Hoppuse Benchmark 'cmpthese';
for my $mag (map 10**$_, 1 .. 6) {
print "\n$mag:\n";
cmpthese -2 => {
loop => sub {my $x = 0; for (my $i = 0; $i <= $mag; $i++) {$x += $i}},
each => sub {my $x = 0; for my $i (0 .. $mag) {$x += $i}},
};
}
输出结果如下:
10: 每次循环 每个元素 循环 613877/s -- -2% 每个元素 625568/s 2% --
100: 每次循环 每个元素 循环 79481/s -- -24% 每个元素 104758/s 32% --
1000: 每次循环 每个元素 循环 8140/s -- -27% 每个元素 11220/s 38% --
10000: 每次循环 每个元素 循环 832/s -- -26% 每个元素 1124/s 35% --
100000: 每次循环 每个元素 循环 81.6/s -- -26% 每个元素 110/s 34% --
1000000: 每次循环 每个元素 循环 6.90/s -- -26% 每个元素 9.27/s 34% --
使用三部分的for
循环,你可以在循环内部执行$i += 3
等操作,但是使用foreach
循环则不行。这就是它们之间的区别。
你最初在C风格循环中遇到的那个“差一”错误表明,C风格循环更容易出错,只有在实际需要访问循环计数器时才应使用。使用foreach循环会使得出现“差一”错误变得更加困难。
$i
在数组 $array
的所有索引范围内进行循环:for $i ( 0 .. $#array ) { ... }
- tchristuse 5.14.0; while (my ($i, $elem) = each @a) { ... }
- Joel Berger我认为您发布的两个循环示例行为相同。在这两种情况下,$i
的作用域是词法作用域(因为您使用了 my
关键字)。我认为 0..$n
语法更清晰,但(惊喜!)并不是每个人都会同意。
$#array
是 @array
的最后一个有效索引,而不是数组的长度。要获取 @array
的最后一个元素,必须使用 0 .. @array
或 0 .. $#array + 1
。 - Ted Hopp