如何声明函数并以递归方式使用它而无需“调用原型检查得太早”

时间:2019-02-04 15:30:07

标签: perl prototype

我有一个通用的递归函数,但是为什么在perl中没有授权它

sub pv($) {
    my ($vars) = @_;
    if(ref($vars) eq 'SNMP::Varbind') {
        return $vars->tag() . (defined($vars->iid()) ? '.' . $vars->iid() : '');
    } elsif (ref($vars) eq 'SNMP::VarList') {
        return join(', ', map { pv($_) } @$vars);
    } elsif(ref($vars) eq 'ARRAY') {
        return join('.', @{$vars});
    } else {
        return $vars;
    }
}

此行的错误代码“ pv()调用得太早,无法检查原型”返回join(',',map {pv($ _)} @ $ vars);

2 个答案:

答案 0 :(得分:8)

简单:向前声明

sub pv($);
sub pv($) {

答案 1 :(得分:1)

在Perl 5.16+上,您可以使用current_sub feature

use strict;
use warnings;
use feature 'current_sub';

sub pv($) {
  ...
  __SUB__->($_)
  ...
}

这在使用匿名子时更有用,这样您就不会创建一个内存周期(因为它会封闭对自身的引用;命名子不会发生这种情况,因为它只是查找符号)

此外,请考虑不使用原型。除非您知道自己为什么这样做,否则很有可能不需要它。原型用于解析器,而不用于调用者。没有原型,用括号调用就足以延迟符号查找。