2014-10-28 134 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++; 
}