有人能告诉我,为什么我会得到无限循环?虽然它不会循环无限循环。
#!/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;
}
}
答案 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
,则会有效。
但改变循环的运行变量并不是一个好习惯。