如何在perl中探索对象?

时间:2016-02-19 05:51:42

标签: perl introspection

我有这个Perl代码:

use HTTP::Daemon;
use Data::Printer;
my $d = HTTP::Daemon->new( 
    LocalHost => "localhost",
    LocalPort => 8080
) || die;
while (my $c = $d->accept) {
    print ref $c;
    print $c;
    print %{*$c};
    p $c;
    print $c->sockhost . "\n"
}

返回的对象$ c是“HTTP :: Daemon :: ClientConn = GLOB(0x85543d8)”。 原始代码表明,有一个 sockhost 成员,但我想知道它可能有哪些其他成员?我的印刷工作都没有帮助。即使是meta::CPAN页面也是静默的,但我想在代码中使用一般解决方案来揭示 $ c 是什么。作为参考,我有Perl v5.12.4。

2 个答案:

答案 0 :(得分:2)

HTTP :: Daemon记录了它支持的方法http://search.cpan.org/~gaas/HTTP-Daemon-6.01/lib/HTTP/Daemon.pm。它还通过继承支持所有IO :: Socket :: INET方法。

然而,关于如何一般地检查Perl类暴露答案的方法的更一般的问题是你不能。在Perl中,可以在运行时动态生成方法,因此没有工具可以检查对象并告诉您支持哪些方法。

答案 1 :(得分:1)

Data::PrinterData::Dumper更有用。它显示了对象的内部结构,包括所有方法。您需要从CPAN安装它。

use Data::Printer; # or just "use DDP;" for short

my $obj = SomeClass->new;
p($obj);

这可能会给你类似的东西:

\ SomeClass  {
    Parents       Moose::Object
    Linear @ISA   SomeClass, Moose::Object
    public methods (3) : bar, foo, meta
    private methods (0)
    internals: {
       _something => 42,
    }
}