如何确定Perl中受祝福的引用的类型?

时间:2008-08-14 14:11:43

标签: perl reference types

在Perl中,对象只是对已被保存到特定类中的任何基本Perl数据类型的引用。在未使用的引用上使用ref()函数时,会告诉您引用所指向的数据类型。但是,当您在受祝福的引用上调用ref()时,将返回引用已被祝福的包的名称。

我想知道祝福参考的实际基础类型。我该如何确定?

3 个答案:

答案 0 :(得分:20)

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

显然,您还必须检查ARRAYSCALAR类型。自Perl 5.003以来,UNIVERSAL模块(作为所有对象的基类)已经成为核心的一部分。

另一种方法 - 容易但有点脏 - 是将参考字符串化。假设该类没有重载字符串化,您将获得类似Class=HASH(0x1234ABCD)的内容,您可以解析它以提取基础数据类型:

my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);

答案 1 :(得分:6)

你可能不应该这样做。对象的基础类型是一个你不应该搞乱的实现细节。你为什么想知道这个?

答案 2 :(得分:2)

我对此的第一个想法是:“Perl中的对象总是哈希引用,那么hack是什么?”

但是,Scalar :: Util :: reftype就是答案。谢谢你提出这个问题。

这是一个代码片段来证明这一点..(如果它对任何人都有用)。

$> perl -e 'use strict; use warnings "all";
            my $x = [1]; bless ($x, "ABC::Def");
            use Data::Dumper; print Dumper $x;
            print ref($x) . "\n";
            use Scalar::Util "reftype"; print reftype($x) . "\n"'`

输出:

$VAR1 = bless( [
                 1
               ], 'ABC::Def' );
ABC::Def
ARRAY