解决方法
告诉你有什么类型的对象的标准方法是
ref
或
Scalar::Util
::祝福。如果你知道对象是祝福的,那么他们返回相同的信息。
my $class1 = blessed( $obj ); my $class2 = ref $obj;
但是ref也会返回’HASH’为无耻的哈希,而祝福拒绝玩这个游戏。
至于方法列表,对于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; }
>这将适用于合理复杂的对象,但如果拥有包包含大量生成的代码,知道哪些包的生成器卡住了代码指针不是有帮助的。这将意味着更多的找到什么包生成代码。
>在这种情况下,你可能得到代码运行你的代码,包括Data::Dumper
和设置$ Data :: Dumper :: Deparse为1,像这样:(local $ Data :: Dumper :: Deparse = 1;)和然后转储代码指针,像这样:say Dumper($ code_ref);
>它不适用于尚未由任何AUTOLOAD方法创建的有效方法。如果你看到那些在列表中,对象可能做更多,但它的所有它,你不知道。
>包含“基类”UNIVERSAL,因为该类包含对象可用的行为。
祝你好运。