在Perl中,对象只是对已被保存到特定类中的任何基本Perl数据类型的引用.在未使用的引用上使用ref()函数时,会告诉您引用所指向的数据类型.但是,当您在受祝福的引用上调用ref()时,将返回引用已被祝福的包的名称.
我想知道祝福参考的实际基础类型.我怎么能确定这个?
Scalar::Util::reftype()
是最干净的解决方案.该Scalar::Util
模块已添加到版本5.7中的Perl核心,但可用于CPAN的旧版本(5.004或更高版本).
你也可以探测UNIVERSAL::isa()
:
$x->isa('HASH') # if $x is known to be an object UNIVERSAL::isa($x, 'HASH') # if $x might not be an object or reference
显然,你还必须检查ARRAY
和SCALAR
类型.自Perl 5.003以来,UNIVERSAL模块(作为所有对象的基类)已经成为核心的一部分.
另一种方法 - 容易但有点脏 - 是将参考字符串化.假设类没有重载字符串化,你会得到类似的东西Class=HASH(0x1234ABCD)
,你可以解析它来提取底层数据类型:
my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);
你可能不应该这样做.对象的基础类型是一个你不应该搞乱的实现细节.你为什么想知道这个?