【问题标题】:How to explore an object in perl?如何在 perl 中探索对象?
【发布时间】:2016-02-19 05:51:42
【问题描述】:

我有这个 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。

【问题讨论】:

  • perldoc.perl.org/UNIVERSAL.html 有一些有趣的东西。就像can 方法一样。不过可能也值得研究一下自动加载,这可能会说明为什么这很难。

标签: perl introspection


【解决方案1】:

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

但是,关于如何普遍检查 Perl 类公开哪些方法的更普遍的问题,答案是您不能。在 Perl 中,方法可以在运行时动态生成,因此没有工具可以检查对象并告诉您支持哪些方法。

【讨论】:

  • 由于 Perl 方法可以动态生成,这正是我想要一个运行时工具的原因。我认为 Perl 确实支持自省,例如stackoverflow.com/questions/10142530/… 。使用帮助“模块名称”;看起来也很有希望。
  • @MKaama 如果一个方法没有被记录,那么它就不是模块公共 API 的一部分,它可能随时改变。文档是您应该为此使用的唯一工具。
【解决方案2】:

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

【讨论】:

  • 仔细检查我的代码,您可能会注意到,我已经在使用 Data::Printer,但它没有透露任何有意义的细节。然而,Class::Inspector 做到了!你可能想写一个关于这个的答案。
猜你喜欢
  • 2010-12-10
  • 1970-01-01
  • 2017-07-17
  • 2021-12-01
  • 2022-10-15
  • 1970-01-01
  • 2015-04-15
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多