Разница между двумя стилями циклов for
в Perl заключается в ясности и эффективности.
Когда вы смотрите на 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% --