在Perl中,如何确定子例程是否作为方法调用?

时间:2013-08-13 19:44:58

标签: perl methods

有没有办法确定子程序是作为方法(使用@ISA探测)还是作为普通子程序调用的?也许有某种扩展模块超级caller()

例如,给定

package Ad::Hoc;

sub func() { ... }

func()如何区分以下两个调用:

Ad::Hoc->func;            # or $obj->func

Ad::Hoc::func('Ad::Hoc'); # or func($obj)

(我知道,这样做的愿望是可怜设计™的指示。)

2 个答案:

答案 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
    }
}