2016-02-19 25 views
1

我有这样的Perl代码:如何在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守护程序:: :: ClientConn = GLOB(0x85543d8)”。 原始代码表明,有一个sockhost成员,但我不知道其他成员可能有什么?我的印刷工作都没有帮助。即使meta::CPAN页面也是无声的,但我想要一个通用的代码解决方案来揭示什么是$ c是。作为参考,我有Perl v5.12.4。

+0

http://perldoc.perl.org/UNIVERSAL.html有一些有趣的东西。像'can'方法一样。可能也值得一看autoload,这可能会让人明白为什么这很难。 – Sobrique

回答

2

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

然而,关于如何在一般情况下查看Perl类提供的答案的一般问题,则不能。在Perl中,可以在运行时动态生成方法,因此没有可以检查对象并告诉你支持哪些方法的工具。

+0

由于Perl方法可以动态生成,这正是我想要一个运行时工具的原因。我认为Perl支持内省,例如http://stackoverflow.com/questions/10142530/how-can-i-perform-introspection-in-perl。使用帮助'模块名';也似乎很有希望。 – MKaama

+0

@MKaama如果没有记录方法,那么它不是模块的公共API的一部分,它可以随时更改。文档是您应该使用的唯一工具。 – ThisSuitIsBlackNot

0

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, 
    } 
} 
+0

仔细检查我的代码,您可能会注意到,我已经在使用Data :: Printer,但没有透露任何有意义的细节。但是,Class :: Inspector做到了!你可能想写一个关于这个问题的答案。 – MKaama