如何在Perl中确定受祝福引用的类型?
在Perl中,对象只是对任何基本Perl数据类型的引用,这些基本Perl数据类型已被放入特定的类中。当您对未禁用的引用使用ref()函数时,系统会告诉您引用指向的数据类型。但是,当您对受祝福的引用调用ref()时,将返回该引用被祝福的包的名称如何在Perl中确定受祝福引用的类型?,perl,reference,types,Perl,Reference,Types,在Perl中,对象只是对任何基本Perl数据类型的引用,这些基本Perl数据类型已被放入特定的类中。当您对未禁用的引用使用ref()函数时,系统会告诉您引用指向的数据类型。但是,当您对受祝福的引用调用ref()时,将返回该引用被祝福的包的名称 我想知道受祝福引用的实际底层类型。我如何确定这一点呢?对此我的第一个想法是:“Perl中的对象总是散列引用,那么什么是hack?” 但是,Scalar::Util::reftype是答案。谢谢你把问题放在这里 下面是一段代码片段来证明这一点。。(如果对任何
我想知道受祝福引用的实际底层类型。我如何确定这一点呢?对此我的第一个想法是:“Perl中的对象总是散列引用,那么什么是hack?” 但是,Scalar::Util::reftype是答案。谢谢你把问题放在这里 下面是一段代码片段来证明这一点。。(如果对任何人有用) $>perl-e'使用严格的;使用警告“全部”; 我的$x=[1];祝福($x,“ABC::Def”); 使用数据::转储程序;打印转储程序$x; 打印参考($x)。“\n”; 使用标量::Util“reftype”;打印参考类型($x)。“\n”` 输出: $VAR1 = bless( [ 1 ], 'ABC::Def' ); ABC::Def ARRAY $VAR1=祝福([ 1. ]“ABC::Def”); ABC::Def 排列
你可能不应该这样做。对象的底层类型是一个不应该弄乱的实现细节。为什么要知道这一点?
Scalar::Util::reftype()
是最干净的解决方案。该模块在版本5.7中添加到Perl core中,但可从CPAN获得较旧版本(5.004或更高版本)
您还可以使用UNIVERSAL::isa()
进行探测:
显然,您还必须检查ARRAY
和SCALAR
类型。通用模块(作为所有对象的基类)自Perl 5.003以来一直是核心的一部分
另一种方法——简单但有点脏——是将引用字符串化。假设类没有重载字符串化,您将返回类似于class=HASH(0x1234ABCD)
的内容,您可以对其进行解析以提取底层数据类型:
my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);
同意,我知道会有人发表这一评论。我真的只需要在试图找出一个模块正在创建的结构时使用它,这样我就可以修改模块了。我想从结构中的任何散列中删除一个特定的键,因为它们包含原始JPEG。后来我发现我可以使用Data::Dumper::sortkeys来过滤这些数据,这样Data::Dumper就不会产生兆字节的二进制输出。对象通常作为散列引用实现,但这不是必需的。对象可以是任何引用类型;如果那不是一个对象,你会得到false。如果类型不正确,则为false;如果类型正确,则为true.)
$x->isa('HASH') # if $x is known to be an object
UNIVERSAL::isa($x, 'HASH') # if $x might not be an object or reference
my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);