[英]Which “for” loop should I use in Perl?
使用其中一個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)
您將調用范圍運算符,而不是在循環頂部進行簡單比較。 但是,性能差異是無法估量的。
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% --
使用三部分for
循環,你可以$i += 3
,如果你想從循環內部這樣做,但是使用foreach
循環,你不是。 這就是區別。
您最初在C風格循環中出現的逐個錯誤表明C風格的循環更容易出錯,並且只有在您確實需要訪問循環計數器時才應該使用。 foreach循環使得逐個錯誤變得更加困難。
我相信你發布的兩個循環示例表現相同。 在這兩種情況下, $i
都是詞法范圍的(因為你使用my
關鍵字)。 我認為0..$n
語法更清晰,但(驚喜!)不是每個人都同意這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.