检查 Perl 数据引用类型
Checking Perl data reference type
在 Perl 中检查引用类型时,为什么使用 constant 编译指示更好:
use constant HASH => ref {};
die "I expect a hashref" unless $ref_type eq HASH;
比硬编码字符串:
die "I expect a hashref" unless $ref_type eq 'HASH';
优点和缺点是什么(如果有的话)?
我能看到的主要优点是,在 strict 'subs'
有效的情况下,如果 标识符 拼写错误,则会引发错误,而拼写错误 string 会被忽视。
例如,如果我写
use strict;
use warnings;
my $data = {};
die "I expect a hashref" unless ref $data eq 'HSH';
然后我的代码编译没有问题,但不会 运行 正确。但如果我有
use strict;
use warnings;
use constant HASH => ref {};
my $data = {};
die "I expect a hashref" unless ref $data eq HSH;
然后我被告知
Bareword "HSH" not allowed while "strict subs" in use
在程序甚至开始之前运行。
这是提及Scalar::Util
提供的reftype
功能的适当位置。
ref
运算符将 return HASH
如果应用于简单的哈希引用。但是,如果该引用已经 祝福 将其转换为 Perl 对象,ref
将 return [=62= 的 名称]引用已加持
一个对象通常是一个受祝福的散列引用,但它可以由对任何类型数据的引用构成——包括子例程和类型团。显然,一个简单的 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;
输出
Plain hash reference
ref => HASH
reftype => HASH
Blessed hash reference
ref => Class
reftype => HASH
正如你所看到的,ref
和reftype
return对于一个简单的哈希引用的结果相同,而只有reftype
可以看到后面的class 的祝福引用,以查看其基础数据类型未更改。
@Borodin 在这种情况下有正确答案,错字保护。值得一提的是,这种技术还可以保护您免受未记录的假设的影响。如果未记录 ref {}
的行为,则代码在稍后更改后将继续工作。 (我想不出一个现在有用的好例子)。
但是,记录在案的 ref
行为发生变化的可能性很小,您应该购买保险以防被骑着流星的恐龙击中。
你也问了缺点。创建常量对性能的影响非常小,但这只是在启动时。我们说的是毫秒。一旦创建,它们不会因使用而受到惩罚。
在 Perl 中检查引用类型时,为什么使用 constant 编译指示更好:
use constant HASH => ref {};
die "I expect a hashref" unless $ref_type eq HASH;
比硬编码字符串:
die "I expect a hashref" unless $ref_type eq 'HASH';
优点和缺点是什么(如果有的话)?
我能看到的主要优点是,在 strict 'subs'
有效的情况下,如果 标识符 拼写错误,则会引发错误,而拼写错误 string 会被忽视。
例如,如果我写
use strict;
use warnings;
my $data = {};
die "I expect a hashref" unless ref $data eq 'HSH';
然后我的代码编译没有问题,但不会 运行 正确。但如果我有
use strict;
use warnings;
use constant HASH => ref {};
my $data = {};
die "I expect a hashref" unless ref $data eq HSH;
然后我被告知
Bareword "HSH" not allowed while "strict subs" in use
在程序甚至开始之前运行。
这是提及Scalar::Util
提供的reftype
功能的适当位置。
ref
运算符将 return HASH
如果应用于简单的哈希引用。但是,如果该引用已经 祝福 将其转换为 Perl 对象,ref
将 return [=62= 的 名称]引用已加持
一个对象通常是一个受祝福的散列引用,但它可以由对任何类型数据的引用构成——包括子例程和类型团。显然,一个简单的 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;
输出
Plain hash reference
ref => HASH
reftype => HASH
Blessed hash reference
ref => Class
reftype => HASH
正如你所看到的,ref
和reftype
return对于一个简单的哈希引用的结果相同,而只有reftype
可以看到后面的class 的祝福引用,以查看其基础数据类型未更改。
@Borodin 在这种情况下有正确答案,错字保护。值得一提的是,这种技术还可以保护您免受未记录的假设的影响。如果未记录 ref {}
的行为,则代码在稍后更改后将继续工作。 (我想不出一个现在有用的好例子)。
但是,记录在案的 ref
行为发生变化的可能性很小,您应该购买保险以防被骑着流星的恐龙击中。
你也问了缺点。创建常量对性能的影响非常小,但这只是在启动时。我们说的是毫秒。一旦创建,它们不会因使用而受到惩罚。