有人能告訴我,爲什麼我會得到一個無限循環?儘管如此,它不會無限循環。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;
}
}
有人能告訴我,爲什麼我會得到一個無限循環?儘管如此,它不會無限循環。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;
}
}
TLDR;因爲你在你的身體中指定了i = 0,所以step部分會增加i ++,使你處於無限循環。你可以在i = 0之後添加一個break語句來解決這個問題。
初始化部分將被執行一次時,執行到這一點。
然後,在那之後立即執行TEST部分。如果這是錯誤的,則整個循環被跳過。如果TEST部分爲真,則執行BODY,然後執行STEP部分。
所以一旦你執行該語句體,臺階部分被執行導致對我是大於1個
參考這對於循環perl的風格來自 c spec from gnu
C語言規範我們關心的部分(剪切和粘貼)
for語句首先評估表達式initialize。然後它評估表達測試。如果測試是錯誤的,那麼循環結束並且程序控制在聲明之後重新開始。 否則,如果測試爲真,則執行語句。最後,評估步驟,並且循環的下一次迭代從再次評估測試開始。
如果ipv4和ipv6等於,則將$i
設置爲零。循環中的nextstep正在遞增$i
,然後它將與$i>0
一起惹事。如果將$i=0
更改爲$i=-1
,它將起作用。
但是,更改循環的運行變量並不是一個好習慣。
在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++;
}
如果你篡改迭代器中間飛行,這是一個好兆頭,這是一個'for'循環是一個錯誤的構造將被使用G。 – Sobrique 2014-10-28 13:17:42