簡體   English   中英

我應該在Perl中使用哪個“for”循環?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM