有没有办法确定子程序是作为方法(使用@ISA探测)还是作为普通子程序调用的?也许有某种扩展模块超级caller()?
例如,给定
package Ad::Hoc;
sub func() { ... }
func()
如何区分以下两个调用:
Ad::Hoc->func; # or $obj->func
Ad::Hoc::func('Ad::Hoc'); # or func($obj)
(我知道,这样做的愿望是可怜设计™的指示。)
答案 0 :(得分:10)
查看Devel::Caller是否有帮助。我更改了代码以在对象上调用func
,它似乎在我的Mac上使用perl
5.14.3(和5.24.0):
called_as_method($level)
called_as_method returns
如果$level
处的子程序被调用为方法,则为true。
#!/usr/bin/env perl
package Ad::Hoc;
use strict; use warnings;
use Devel::Caller qw( called_as_method );
sub func {
printf "%s\n", called_as_method(0) ? 'method' : 'function';
return;
}
package main;
use strict; use warnings;
Ad::Hoc->func;
Ad::Hoc::func();
输出:
method function
答案 1 :(得分:-2)
package Ad::Hoc;
sub foo {
my $self = shift;
if(ref($self) ne 'Ad::Hoc') {
unshift @_, $self;
undef $self;
}
if($self) {
# I'm a method
} else {
# I'm a sub
}
}