检查Perl数据引用类型

jre*_*ger 4 perl reference

在Perl中检查引用类型时,为什么使用常量 pragma 更好:

use constant HASH => ref {};

die "I expect a hashref" unless $ref_type eq HASH;
Run Code Online (Sandbox Code Playgroud)

而不是硬编码的字符串:

die "I expect a hashref" unless $ref_type eq 'HASH';
Run Code Online (Sandbox Code Playgroud)

有什么优点和缺点(如果有的话)?

Bor*_*din 5

我可以看到的主要优点是,strict 'subs'实际上,如果标识符拼写错误,那么它将引发错误,而拼写错误的字符串将被忽视.

例如,如果我写

use strict;
use warnings;

my $data = {};

die "I expect a hashref" unless ref $data eq 'HSH';
Run Code Online (Sandbox Code Playgroud)

然后我的代码编译没有问题,但将无法正常运行.但如果我有了

use strict;
use warnings;

use constant HASH => ref {};

my $data = {};

die "I expect a hashref" unless ref $data eq HSH;
Run Code Online (Sandbox Code Playgroud)

然后我被告知

Bareword "HSH" not allowed while "strict subs" in use
Run Code Online (Sandbox Code Playgroud)

在程序开始运行之前.


这是一个适当的地方提到的reftype功能Scalar::Util.

ref运营商将返回HASH如果它被应用到一个简单的散列引用.但是,如果该引用已被祝福将其转换为Perl对象,ref则将返回引用已被祝福的类名称.

对象通常是受祝福的哈希引用,但它可以通过对任何类型数据的引用形成 - 包括子例程和类型块.显然,一个简单的东西ref无法帮助我们发现用于创建对象的底层Perl数据类型,因此reftype编写这些内容以填补这一空白.

考虑一下这个Perl程序

use strict;
use warnings;

use Scalar::Util 'reftype';

my $data = { };

print "Plain hash reference\n";
printf "  ref     => %s\n", ref $data;
printf "  reftype => %s\n", reftype $data;

bless $data, 'Class';

print "\nBlessed hash reference\n";
printf "  ref     => %s\n", ref $data;
printf "  reftype => %s\n", reftype $data;
Run Code Online (Sandbox Code Playgroud)

产量

Plain hash reference
  ref     => HASH
  reftype => HASH

Blessed hash reference
  ref     => Class
  reftype => HASH
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,refreftype为简单的哈希引用返回相同的结果,而只能reftype在祝福引用的类后面看到它的基础数据类型未更改.