perl中的无限for循环

时间:2014-10-28 12:33:17

标签: perl

有人能告诉我,为什么我会得到无限循环?虽然它不会循环无限循环。

#!/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;
    }
}

4 个答案:

答案 0 :(得分: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++;
}

答案 1 :(得分:3)

因为在for ($i = 1; $i > 0; $i++){中,结束条件$i > 0;永远不会到达。

答案 2 :(得分:3)

TLDR; 因为您在身体中指定了i = 0,所以步骤部分会递增i ++,使您处于无限循环中。你可以在i = 0之后添加一个break语句来修复它。



执行到达该点时,INITIALIZE部分将执行一次。

然后,在此之后立即执行TEST部分。如果这是假,则跳过整个循环。如果TEST部分为真,则执行BODY,然后执行STEP部分。

因此,一旦执行了语句的主体,就会执行步骤部分,导致I大于1

引用循环的perl样式来自的C语言规范 c spec from gnu

我们关心的部分(剪切和粘贴)

for语句首先计算表达式initialize。然后它评估表达式测试。如果test为false,则循环结束,程序控制在语句后重新开始。 否则,如果test为true,则执行语句。最后,评估步骤, ,循环的下一次迭代从再次评估测试开始。

答案 3 :(得分:0)

如果ipv4和ipv6相等,则将$i设置为零。循环中的nextstep正在递增$i,然后它将与$i>0同步,这是真的。如果您将$i=0更改为$i=-1,则会有效。

但改变循环的运行变量并不是一个好习惯。