在Perl中使用哪个"for"循环?

Tim*_*Tim 10 perl for-loop

使用其中一个for循环来计算整数的参数是什么?

for my $i (0..$n) { ... }

for (my $i = 0; $i <= $n; $i++) { ... }
Run Code Online (Sandbox Code Playgroud)

Bri*_*ach 11

在你的情况下,没有区别.

在其他用例中,在for-each循环中,您无法控制/访问迭代器.

编辑试图让这个更清晰:

使用您的示例语法:

for my $i (0..10)
{
   print "$i";
   $i++;
}
Run Code Online (Sandbox Code Playgroud)

上面实际上创建了一个foreach循环 - 它与说法相同foreach my $i (0..10).$i从列表返回,而不是迭代器.迭代器是内部的,你无法访问它; 你无法控制循环的流量.

将打印上面的输出 012345678910

这个:

for ( my $i = 0; $i++ ; $i <= 10)
{
    print $i;
    $i++;
}
Run Code Online (Sandbox Code Playgroud)

这是一个实际的for循环.您正在控制并输出迭代器.它将输出: for

编辑:此外:

当您这样做时,0246810您将调用范围运算符,而不是在循环顶部进行简单比较.但是,性能差异是无法估量的.

  • @Brian - 我相信`for`和`foreach`是同义词.它们之间从来没有任何区别(可读性除外). (2认同)
  • @Eric - `foreach(我的$ i = 0; $ i <5; ++ $ i){print"$ i \n"; }`完美地运作. (2认同)

Eri*_*rom 6

forPerl中两种循环风格之间的区别在于清晰度和效率.

当你看时,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}},
    };
}
Run Code Online (Sandbox Code Playgroud)

打印:

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%   --


tch*_*ist 5

使用三部分for循环,您可以$i += 3在循环内进行,但foreach如果不是,则可以。那是区别。