使用其中一个for
循环来计算整数的参数是什么?
for my $i ( 0..$n ) { ... }
for ( my $i = 0; $i <= $n; $i++ ) { ... }
答案 0 :(得分:10)
在你的情况下,没有区别。
在其他用例中,在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)
时,您正在调用range operator而不是在循环顶部进行简单比较。但是,性能差异是无法估量的。
答案 1 :(得分:5)
Perl中两种for
循环样式之间的区别在于清晰度和效率。
当您查看for my $i (0 .. $n) {...}
时,您可以立即查看正在使用的范围,而无需在心理上解析更大的表达式。
使用for (my $i = 0; $i <= $n; $i++) {...}
可以看到更多内容,以及更多可能出现错误的地方。
此外,范围内的foreach
比等效的C风格循环更快,如以下基准所示:
use 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: Rate loop each loop 613877/s -- -2% each 625568/s 2% -- 100: Rate loop each loop 79481/s -- -24% each 104758/s 32% -- 1000: Rate loop each loop 8140/s -- -27% each 11220/s 38% -- 10000: Rate loop each loop 832/s -- -26% each 1124/s 35% -- 100000: Rate loop each loop 81.6/s -- -26% each 110/s 34% -- 1000000: Rate loop each loop 6.90/s -- -26% each 9.27/s 34% --
答案 2 :(得分:4)
使用三部分for
循环,您可以$i += 3
,如果您想要在循环内,但使用foreach
循环,则不是。{{1}}差别就是这样。
答案 3 :(得分:4)
您最初在C风格循环中出现的逐个错误表明C风格的循环更容易出错,并且只有在您确实需要访问循环计数器时才应该使用。 foreach循环使得逐个错误变得更加困难。
答案 4 :(得分:2)
我相信您发布的两个循环示例的行为相同。在这两种情况下,$i
都是词法范围(因为您使用my
关键字)。我认为0..$n
语法更清晰,但是(惊喜!)不是每个人都同意这一点。