2014-10-28 128 views
2

有人能告訴我,爲什麼我會得到一個無限循環?儘管如此,它不會無限循環。perl中的無限for循環

#!/usr/bin/perl 

use strict; 
use warnings; 

my $i; 
my $ipv4 = 0; 
my $ipv6 = 0; 

for ($i = 1; $i > 0; $i++){ 
    print "$i\n"; 
    if($ipv4 eq $ipv6){ 
     $i = 0; 
    } 
} 
+1

如果你篡改迭代器中間飛行,這是一個好兆頭,這是一個'for'循環是一個錯誤的構造將被使用G。 – Sobrique 2014-10-28 13:17:42

回答

3

因爲for ($i = 1; $i > 0; $i++){結束條件$i > 0;從未達到。

+0

但是如果$ ipv4等於$ ipv5,那麼$ i被設置爲0,所以理論上的$ i可以是零?! – Jens 2014-10-28 12:41:34

+0

@Jens:不,因爲在循環結束時和測試'$ i> 0'之前執行的$ i ++'。 – Toto 2014-10-28 12:43:59

+0

但你的答案中沒有解釋。請將信息添加到此。 – Jens 2014-10-28 12:45:22

3

TLDR;因爲你在你的身體中指定了i = 0,所以step部分會增加i ++,使你處於無限循環。你可以在i = 0之後添加一個break語句來解決這個問題。



初始化部分將被執行一次時,執行到這一點。

然後,在那之後立即執行TEST部分。如果這是錯誤的,則整個循環被跳過。如果TEST部分爲真,則執行BODY,然後執行STEP部分。

所以一旦你執行該語句體,臺階部分被執行導致對我是大於1個

參考這對於循環perl的風格來自 c spec from gnu

C語言規範我們關心的部分(剪切和粘貼)

for語句首先評估表達式initialize。然後它評估表達測試。如果測試是錯誤的,那麼循環結束並且程序控制在聲明之後重新開始。 否則,如果測試爲真,則執行語句。最後,評估步驟,並且循環的下一次迭代從再次評估測試開始。

0

如果ipv4和ipv6等於,則將$i設置爲零。循環中的nextstep正在遞增$i,然後它將與$i>0一起惹事。如果將$i=0更改爲$i=-1,它將起作用。

但是,更改循環的運行變量並不是一個好習慣。

5

在for循環中,第三個語句$i++在每個塊的末尾執行,第二個語句$i > 0在開始處執行。

(您也使用字符串比較eq代替了數值==的。)

實際上你在做什麼是等價的:

$i = 1; 
while ($i > 0){ 
    print "$i\n"; 
    if($ipv4 == $ipv6){ 
     $i = 0; 
    } 
    $i++; 
} 

您應該使用last語句來代替:

$i = 1; 
while (1) { 
    print "$i\n"; 
    if($ipv4 == $ipv6) { 
     last; 
    } 
    $i++; 
}