在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类型。 UNIVERSAL模块(作为所有对象的基类)自Perl 5.003以来一直是核心的一部分。
另一种方式 – 容易但有点脏 – 是引用引用。假设类没有重载字符串,你会得到类似于Class = HASH(0x1234ABCD)的东西,你可以解析它来提取底层数据类型:
my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);