如何在Perl中确定祝福引用的类型?
时间:2020-03-05 18:39:38 来源:igfitidea点击:
在Perl中,对象只是对已被祝福到特定类中的任何基本Perl数据类型的引用。当我们在无祝福的引用上使用ref()函数时,系统会告诉我们引用指向的数据类型。但是,当我们在有祝福的引用上调用ref()时,将返回该祝福被引用到的包的名称。
我想知道该祝福引用的实际基础类型。我该如何确定?
解决方案
回答
我对此的第一个想法是:" Perl中的对象始终是哈希引用,那么该怎么办?"
但是,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
回答
我们可能不应该这样做。对象的基础类型是我们不应弄混的实现细节。你为什么想知道这个?
回答
标量:: 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);