如何使用Perl新class特性转储对象实例以查看封装数据?
查看Perl experimental class封装的对象内部数据
使用Perl 5.040的experimental 'class'语法定义的类,其内部的field成员属于封装的私有数据,常规调试工具(如Data::Dumper、DDS、Data::Dx、DDP)无法直接解析这些内容。以下是几种可行的解决方案:
方案1:用Devel::Peek查看底层结构
Devel::Peek可以直接查看Perl变量的底层存储结构,能暴露封装的field数据:
use 5.040; use strictures; use experimental 'class'; use Devel::Peek; class Foo { field @member = qw(e r t); } my $foo = Foo->new; Dump $foo;
输出会包含对象的内部数组结构,清晰展示@member的每个元素值。缺点是输出格式较为原始,需要自行解析底层信息。
方案2:添加临时调试访问方法
在类中临时添加一个用于暴露私有数据的方法,调试完成后移除即可:
use 5.040; use strictures; use experimental 'class'; use Data::Dumper qw(Dumper); class Foo { field @member = qw(e r t); # 仅用于调试,生产环境删除 sub get_member { return \@member } } my $foo = Foo->new; say Dumper $foo->get_member;
这种方式输出格式友好,完全可控,但需要修改类代码,适合临时调试场景。
方案3:为Data::Printer添加自定义过滤器
如果习惯用DDP的输出格式,可以通过自定义过滤器解析experimental class对象的内部结构:
use 5.040; use strictures; use experimental 'class'; use DDP; class Foo { field @member = qw(e r t); } # 针对Foo类添加解析过滤器 DDP::add_filter( sub { my ($obj, $ddp) = @_; return unless ref $obj eq 'Foo'; # 直接解引用对象的内部数组(依赖当前experimental class的实现) return { '_member' => [@$obj] }; } ); my $foo = Foo->new; p $foo;
输出会格式化展示私有数据,但注意该方案依赖Perl experimental class的底层实现细节,未来版本可能失效。
内容的提问来源于stack exchange,提问作者daxim
相关产品推荐
相关产品推荐

