Perl - next和redo之间的区别

Rav*_*ddy 3 perl

当我执行一个程序时都给出相同的结果.请解释'next'和'redo'之间的区别.

hob*_*bbs 12

for (1 .. 9) {
    next if $_ % 2;
    print;
}
Run Code Online (Sandbox Code Playgroud)

打印"2468",因为每次$_都是奇数,next跳出循环并继续下一个数字.

for (1 .. 9) {
    redo if $_ % 2;
    print;
}
Run Code Online (Sandbox Code Playgroud)

永远循环并且不打印因为1是奇数,所以redo跳回到循环体的开头而不推进循环,所以$_保持1并且什么也没发生.

  • next将进入foreach循环中的下一个项目; redo惯于.
  • next将在C风格的for循环中运行increment(middle)语句; redo惯于.
  • next将在while循环或C风格for循环中重新检查条件; redo惯于.
  • next将退出裸循环({ ... }); redo将重启它.
  • next会跑一个continue街区; redo惯于.

在语义上,next完成当前迭代,然后执行之后发生的任何事情.再次redo运行当前迭代的所有代码.就像跳到块的底部(事实上​​,如果你在一个不是循环的块中使用它,它只会跳到最后),就像跳到块的顶部(事实上​​,你可以用做循环... 相当于.nextredoredo{ print "Hello"; redo }while (1) { print "Hello" }


Bor*_*din 11

redo,next并在Perl中的循环块last内部使用.大多数情况下,您会看到它们或块,但如果需要,您可以在裸块中使用它们forwhile

本质区别是

  • redo跳到街区的开头 - 开口大括号{
  • next跳到块的末尾 - 结束括号}
  • last 完全跳出了街区

next并且last仅对于块whilefor循环(以及具有continue节的块)不同

所以你可以写一个像这样的循环

my $n;
{
    ++$n;
    print $n, "\n";
    redo if $n < 10;
}
Run Code Online (Sandbox Code Playgroud)

这将打印从1到10的数字