有人能告诉我,为什么我会得到一个无限循环?尽管如此,它不会无限循环。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