当我执行程序时,两种情况都会产生相同的结果。请解释“next”和“redo”的区别。
当我执行程序时,两种情况都会产生相同的结果。请解释“next”和“redo”的区别。
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
循环的增量(中间)语句;redo
不会。next
将重新检查while
循环或C风格for
循环中的条件;redo
不会。next
将退出裸循环({...}
);redo
将重新开始循环。next
将运行continue
块;redo
不会。从语义上讲,next
完成当前迭代,然后执行发生的任何事情之后。 redo
再次运行当前迭代的所有代码。,next
就像跳到块的底部(实际上,如果您在不是循环的块中使用它,它将直接跳到结尾),而redo
就像跳到块的顶部(实际上,您可以使用redo
来创建一个循环...{print"Hello";redo}相当于
while (1){print"Hello"}
。
redo
,next
和last
在Perl的循环块中使用。通常您会在for
或while
块中看到它们,但如果需要,您也可以在裸块中使用它们。
关键区别是:
redo
跳转到块的开头——打开大括号{
next
跳转到块的结尾——闭合大括号}
last
完全跳出块next
和last
仅对while
和for
循环的块(以及具有continue
部分的块)不同。
因此,您可以编写以下类型的循环:
my $n;
{
++$n;
print $n, "\n";
redo if $n < 10;
}
将会打印出从1到10的数字。
Next-程序执行继续进行下一次循环迭代。它就像C语言中的continue
操作符。如果满足某些条件,可以使用Next关键字跳过余下的循环代码。
Redo-它使程序执行回到当前循环的顶部,而不测试任何条件表达式或前进到下一次迭代。
例如,
在Next的情况下
foreach (split){
next; ## next comes here ##
# statements are skipped
}
如果需要重做
LOOPLABEL:
{
$count++;
redo LOOPLABEL if ($count < 3);
#Does not advance to the next iteration
}
下一个:
下一个 关键字可以让您跳过语句块的其余部分并开始下一次迭代。此行为的一个用途是选择特定数组元素进行处理并忽略其余元素。
例如:
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";
{ #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
示例不起作用,因为它不在一个块内。 - dgwredo
操作的循环。 - LeoNerd