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

pil*_*row 7 methods perl

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

例如,给定

package Ad::Hoc;

sub func() { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

Ad::Hoc::func('Ad::Hoc'); # or func($obj)
Run Code Online (Sandbox Code Playgroud)

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

Sin*_*nür 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();
Run Code Online (Sandbox Code Playgroud)

输出:

method
function

  • 但是,如果方法接受可变数量的参数,则只需要使用它.否则,你可以简单地检查`@ _`的大小. (3认同)