在 Perl 中,对象只是对已被添加到特定类中的任何基本 Perl 数据类型的引用。当您对 unblessed 引用使用 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

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

另一种方法——简单但有点肮脏——是对引用进行字符串化。假设该类没有重载字符串化,您将得到类似的结果 Class=HASH(0x1234ABCD), ,您可以解析它以提取基础数据类型:

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

其他提示

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

我对此的第一个想法是:“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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top