Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中确定受祝福引用的类型?_Perl_Reference_Types - Fatal编程技术网

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

如何在Perl中确定受祝福引用的类型?,perl,reference,types,Perl,Reference,Types,在Perl中,对象只是对任何基本Perl数据类型的引用,这些基本Perl数据类型已被放入特定的类中。当您对未禁用的引用使用ref()函数时,系统会告诉您引用指向的数据类型。但是,当您对受祝福的引用调用ref()时,将返回该引用被祝福的包的名称 我想知道受祝福引用的实际底层类型。我如何确定这一点呢?对此我的第一个想法是:“Perl中的对象总是散列引用,那么什么是hack?” 但是,Scalar::Util::reftype是答案。谢谢你把问题放在这里 下面是一段代码片段来证明这一点。。(如果对任何

在Perl中,对象只是对任何基本Perl数据类型的引用,这些基本Perl数据类型已被放入特定的类中。当您对未禁用的引用使用ref()函数时,系统会告诉您引用指向的数据类型。但是,当您对受祝福的引用调用ref()时,将返回该引用被祝福的包的名称


我想知道受祝福引用的实际底层类型。我如何确定这一点呢?

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

但是,Scalar::Util::reftype是答案。谢谢你把问题放在这里

下面是一段代码片段来证明这一点。。(如果对任何人有用)

$>perl-e'使用严格的;使用警告“全部”; 我的$x=[1];祝福($x,“ABC::Def”); 使用数据::转储程序;打印转储程序$x; 打印参考($x)。“\n”; 使用标量::Util“reftype”;打印参考类型($x)。“\n”` 输出:

$VAR1 = bless( [ 1 ], 'ABC::Def' ); ABC::Def ARRAY $VAR1=祝福([ 1. ]“ABC::Def”); ABC::Def 排列
你可能不应该这样做。对象的底层类型是一个不应该弄乱的实现细节。为什么要知道这一点?

Scalar::Util::reftype()
是最干净的解决方案。该模块在版本5.7中添加到Perl core中,但可从CPAN获得较旧版本(5.004或更高版本)

您还可以使用
UNIVERSAL::isa()
进行探测:

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

另一种方法——简单但有点脏——是将引用字符串化。假设类没有重载字符串化,您将返回类似于
class=HASH(0x1234ABCD)
的内容,您可以对其进行解析以提取底层数据类型:

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

同意,我知道会有人发表这一评论。我真的只需要在试图找出一个模块正在创建的结构时使用它,这样我就可以修改模块了。我想从结构中的任何散列中删除一个特定的键,因为它们包含原始JPEG。后来我发现我可以使用Data::Dumper::sortkeys来过滤这些数据,这样Data::Dumper就不会产生兆字节的二进制输出。对象通常作为散列引用实现,但这不是必需的。对象可以是任何引用类型;如果那不是一个对象,你会得到false。如果类型不正确,则为false;如果类型正确,则为true.)
$x->isa('HASH')             # if $x is known to be an object
UNIVERSAL::isa($x, 'HASH')  # if $x might not be an object or reference
my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);