7
4

2 回答 2

10

看看Devel::Caller是否有帮助。我更改了代码以func在对象上调用,它似乎可以在我的 Mac 上使用perl5.14.3(和 5.24.0):

called_as_method($level)

called_as_method returns如果子例程 at$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();

输出:

方法
功能
于 2013-08-13T20:30:14.623 回答
-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
    }
}
于 2013-08-13T19:59:22.177 回答