我有一个通用的递归函数,但是为什么在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);
答案 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__->($_)
...
}
这在使用匿名子时更有用,这样您就不会创建一个内存周期(因为它会封闭对自身的引用;命名子不会发生这种情况,因为它只是查找符号)
此外,请考虑不使用原型。除非您知道自己为什么这样做,否则很有可能不需要它。原型用于解析器,而不用于调用者。没有原型,用括号调用就足以延迟符号查找。