加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 如果AUTOLOAD失败,则传递错误消息

发布时间:2020-12-16 06:19:20 所属栏目:大数据 来源:网络整理
导读:我正在使用AUTOLOAD来处理对某些未定义子例程的调用. sub AUTOLOAD { my $member = $AUTOLOAD; # ... do something if knowing how to handle '$member' # otherwise ?} 在包上调用一个不存在的子例程(比如my_method)时,Perl通常会说类似的东西 Can't locate
我正在使用AUTOLOAD来处理对某些未定义子例程的调用.

sub AUTOLOAD {
    my $member = $AUTOLOAD;
    # ... do something if knowing how to handle '$member'        

    # otherwise ?
}

在包上调用一个不存在的子例程(比如my_method)时,Perl通常会说类似的东西

Can't locate object method "my_method" via package "MyPackage" 
at Package.pm line 99.

我希望Perl显示此标准消息,以防我不知道如何在我的AUTOLOAD实现中处理对子例程$member的调用.

我怎样才能做到这一点?

我发现没有可能包含相应消息的特殊变量.此外,Perl documentation on Autoloading没有提供此问题的提示.

备注:我想避免重写错误消息,而是使用Perl提供的标准消息.

解决方法

不幸的是,你做不到. Perl首先尝试在包中找到一个方法,然后在@ISA中找到它的父包,最后是UNIVERSAL.接下来,它会重复该过程,但会搜索AUTOLOAD以代替方法名称. perl的唯一方法是在调用时引发异常,如果找不到方法的话.如果perl调用了你的AUTOLOAD子程序,它已经超出了定位方法的位置,它只能在AUTOLOAD的堆栈框架内死掉.

如果您绝对需要在调用方法的地方死亡,那么您唯一的选择就是避免使用AUTOLOAD并定义所有方法.

但是,如果只是为了外观,这将伪造它:

sub AUTOLOAD {
    my ($package,$method) = $AUTOLOAD =~ /^(.*)::([^:]*)/;
    die sprintf(qq{Can't locate object method "%s" via package "%s" at %s line %d.n},$method,$package,(caller)[1,2]);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读