当我执行一个同时给出相同结果的程序时。请解释'下一个'和'之间的区别'重做'。
答案 0 :(得分:11)
for (1 .. 9) {
next if $_ % 2;
print;
}
打印“2468”,因为每次$_
为奇数时,next
跳出循环并继续下一个数字。
for (1 .. 9) {
redo if $_ % 2;
print;
}
永远循环并且不打印因为1是奇数,所以redo
跳回到循环体的开头而没有推进循环,所以$_
保持1而没有任何东西永远都会发生。
next
将前进到foreach
循环中的下一个项目; redo
不会。next
将在C风格的for
循环中运行increment(middle)语句; redo
不会。next
将重新检查while
循环或C风格for
循环中的条件; redo
不会。next
将退出裸循环({ ... }
); redo
将重启。next
将运行continue
块; redo
不会。从语义上讲,next
完成当前迭代,然后执行之后发生的任何事情。 redo
运行当前迭代的所有代码。 next
就像跳到块的 bottom 一样(事实上,如果你在一个不是循环的块中使用它,它只会跳到最后),{{1就像跳转到块的顶部一样(事实上,你可以使用redo
制作一个循环... redo
相当于{ print "Hello"; redo }
答案 1 :(得分:8)
redo
,next
和last
在Perl中的循环块中使用。大多数情况下,您会在for
或while
块中看到它们,但如果需要,您可以在裸块中使用它们
本质区别是
redo
跳转到该块的开头 - 左大括号{
next
跳转到该块的 end - 右括号}
last
完全跳出了街区 next
和last
仅对while
和for
循环的块(以及具有continue
部分的块)不同
所以你可以写一个像这样的循环
my $n;
{
++$n;
print $n, "\n";
redo if $n < 10;
}
将打印从1到10的数字
答案 2 :(得分:2)
下一步 -Program继续执行循环的下一次迭代。它就像C.Next关键字中的continue
运算符一样用于跳过循环其余部分的代码有些条件得到满足。
重做 - 使程序执行返回到当前循环的顶部,而不测试任何条件表达式或前进到下一次迭代。
例如,
如果是下一个
foreach (split){
next; ## next comes here ##
# statements are skipped
}
如果是Redo
LOOPLABEL:
{
$count++;
redo LOOPLABEL if ($count < 3);
#Does not advance to the next iteration
}
next和redo之间的主要区别在于next将通过重新评估条件进入下一次迭代,但是redo将重做当前迭代,从循环中的最顶层语句开始执行。
答案 3 :(得分:2)
下一步强>:
next 关键字允许您跳过语句块的其余部分并开始下一次迭代。这种行为的一种用途可能是选择特定的数组元素进行处理并忽略其余的数据元素。
例如:
my @array = (0..9);
print "@array\n";
for (my $index = 0; $index < @array; $index++)
{
if ($index == 3 || $index == 5)
{
next;
}
$array[$index] = "*";
}
print "@array\n";
上面的示例将每个数组元素(第3和第5个除外)更改为星号,而不管它们以前的值。 next 关键字强制Perl跳过赋值语句并直接转到递增/递减表达式。您还可以在嵌套循环中使用 next 关键字。
<强>重做强>:
redo 关键字使Perl重新启动当前语句块。在重新启动块之前,不会评估递增/递减表达式和条件表达式。当从程序外部从键盘或文件获取输入时,通常使用此关键字。必须更改导致 redo 语句执行的条件,以便不会发生无限循环。
例如:
{ #start a statement block
print "What is your name?\n";
my $name = <STDIN>;
chop($name);
if (! length($name))
{
print "Zero length input. Please try again\n";
redo;
}
print "Thank you, " . $name, "\n";
}
值得注意的是, redo 示例中的语句块就像一个单一循环结构。