如何申报功能和递归地使用它,而“叫太早检查原型”

问题描述 投票:6回答:2

我有一个通用的递归函数,但它为什么没有在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()称为太早检查原型” 这一行回报加入( '',地图{PV($ _)} @ $瓦尔);

perl prototype
2个回答
8
投票

很简单:向前声明

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

1
投票

Perl的5.16+,您可以使用current_sub feature

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

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

使用匿名潜艇的时候,让你不创建一个存储周期(,这不符合命名的潜艇发生,因为它只是看起来了符号,因为它会关闭在到自身的引用)这是更为有用。

此外,还应考虑只是不使用原型。这很可能是你并不需要它,除非你知道你为什么这样做;原型解析器,而不是调用。如果没有原型,用括号调用它足以将延迟符号查找。

© www.soinside.com 2019 - 2024. All rights reserved.