在Perl中,对象只是对已被归入特定类的任何基本Perl数据类型的引用。 当您在无祝福的引用上使用ref()函数时,系统会告诉您引用指向的数据类型。 但是,当您在有祝福的引用上调用ref()时,将返回该祝福被引用到的包的名称。
我想知道该祝福引用的实际基础类型。 我该如何确定?
Scalar::Util::reftype()是最干净的解决方案。 Scalar::Util模块已在5.7版中添加到Perl内核中,但可用于CPAN的较早版本(5.004或更高版本)。
您还可以使用UNIVERSAL::isa()进行探测:
1 2
| $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)的内容,可以对其进行解析以提取基础数据类型:
1
| my $type = ($object =~ /=(.+)\\(0x[0-9a-f]+\\)$/i); |
您可能不应该这样做。对象的基础类型是您不应弄混的实现细节。你为什么想知道这个?
我对此的第一个想法是:" Perl中的对象始终是哈希引用,那么该怎么做?"
但是,Scalar :: Util :: reftype是答案。感谢您在此处提出问题。
这是证明这一点的代码片段。(以防任何人使用它)。
1 2 3 4 5 6 7
| $> perl -e 'use strict; use warnings"all";
my $x = [1]; bless ($x,"ABC::Def");
use Data::Dumper; print Dumper $x;
print ref($x) ."\
";
use Scalar::Util"reftype"; print reftype($x) ."\
"'` |
输出:
1 2 3 4 5
| $VAR1 = bless( [
1
], 'ABC::Def' );
ABC::Def
ARRAY |