如何在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包含"基类" ,因为该类包含对象可用的行为.
祝好运.
Scalar :: Util中的blessed函数将告诉您任何有福的引用(对象)的包名称.
要了解可用的方法,请参阅该软件包的文档.或者,您可以使用类似于:: MOP :: Class的方法来实例化元类,并获取有关其包含的方法的内省信息.