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]); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |