perl错误中的简单阶乘函数:在子例程外返回

时间:2017-03-06 06:22:43

标签: perl

我正在研究Perl中的阶乘函数。 下面的代码给出了错误Can't return outside a subroutine.

factorial {
    my $n = $ARGV[0];
    if( $n <= 1 ){
        return 1;  # ----- Error Here -----
    }
    else {
        return $n * factorial($n - 1);
    }
}

我相信我的if语句仍然在子例程中。导致错误的原因是什么?

1 个答案:

答案 0 :(得分:8)

间接方法符号再次出现! [1]

factorial { ... }

正在被解析为

(do { ... })->factorial

问题是您在子声明的开头缺少sub关键字。取代

factorial { ... }

sub factorial { ... }

此外,子例程参数在@_中提供,而不是@ARGV,所以

my $n = $ARGV[0];

应该是

my $n = $_[0];
  -or-
my $n = shift;
  -or-
my ($n) = @_;

最后,使用递归方法效率非常低。子呼叫相当昂贵。以下内容要快得多:

sub factorial {
    my $n = shift;
    my $acc = 1;
    $acc *= $_ for 2..$n;
    return $acc;
}
  1. 它的存在会导致很多错误被捕获,正如您在this magnificent example中所看到的那样。