Perl - next和redo之间的区别

时间:2015-07-20 05:23:36

标签: perl

当我执行一个同时给出相同结果的程序时。请解释'下一个'和'之间的区别'重做'。

4 个答案:

答案 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)

redonextlast在Perl中的循环块中使用。大多数情况下,您会在forwhile块中看到它们,但如果需要,您可以在裸块中使用它们

本质区别是

  • redo跳转到该块的开头 - 左大括号{
  • next跳转到该块的 end - 右括号}
  • last完全跳出了街区

nextlast仅对whilefor循环的块(以及具有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 示例中的语句块就像一个单一循环结构。