如何在Perl上找到我所拥有的对象类型?

Joh*_*n 30 debugging perl

如何在Perl中找到我正在处理的对象类型?我尝试使用perl -d进入调试器,但我不知道该怎么做.同样,我想要一种方法来轻松查看每个对象可用的方法,如何做到这一点?

Axe*_*man 30

告诉你有什么类型的对象的标准方法是ref或.如果你知道对象是幸运的,那么它们会返回相同的信息.Scalar::Util::blessed

my $class1 = blessed( $obj );
my $class2 = ref $obj;
Run Code Online (Sandbox Code Playgroud)

但是ref也会因为无用的哈希而返回'HASH',同时blessed拒绝玩这个游戏.

至于方法列表,对于perl对象的祝福指针样式,很容易自己编写一个.下面的代码对我来说效果很好.它返回映射到定义它们的包的函数名称(那些采用给定名称的"CODE slot").

sub class_methods { 
    use Class::ISA;
    my $obj = shift;
    return unless ref( $obj );
    my %meth_names;
    foreach my $anc ( Class::ISA::self_and_super_path( ref $obj ), 'UNIVERSAL' ) {
        my $stash = \%{"$anc\::"};
        my @funcs 
            = grep { m/^[_\p{Alpha}]/                # begins with _ or alpha
                   && !exists $meth_names{$_}        # no clobbering
                   &&  defined *{$stash->{$_}}{CODE} # has a filled CODE slot
                   } keys %$stash
            ;
        # assign to the "hash slice", keyed by all the entries in @funcs
        # the value of $anc repeated as many times as elements in @funcs.
        @meth_names{@funcs} = ( $anc ) x @funcs;
    }
    return %meth_names;
}
Run Code Online (Sandbox Code Playgroud)
  • 这也适用于相当复杂的对象,但如果拥有的包中包含大量生成的代码,那么知道生成器将代码指针放在哪个包中就不会有帮助了.这将意味着更多地找到什么包生成代码.

  • 在这种情况下,你可能会得到运行代码的代码,包括Data::Dumper并设置$Data::Dumper::Deparse为1,如下所示:( local $Data::Dumper::Deparse = 1;)然后转储代码指针,如下所示:say Dumper( $code_ref );

  • 将不会对那些尚未通过任何可以创建有效的方法的工作AUTOLOAD方法.如果你在列表中看到那些,那么对象可能会做更多,但它所做的一切,你都不知道.

  • UNIVERSAL包含"基类" ,因为该类包含对象可用的行为.

祝好运.


fri*_*edo 5

Scalar :: Util中blessed函数将告诉您任何有福的引用(对象)的包名称.

要了解可用的方法,请参阅该软件包的文档.或者,您可以使用类似于:: MOP :: Class的方法来实例化元类,并获取有关其包含的方法的内省信息.