为什么Scalar :: Util :: reftype返回`undef`而不是空字符串?

Eug*_*kov 3 perl

ref 返回标量值的空字符串。

为什么要Scalar::Util::reftype返回undef而不是像空字符串一样ref

有什么好处undef?相比之下,空字符串的好处是在执行以下操作时减少了编码:

reftype $data eq 'HASH'
Run Code Online (Sandbox Code Playgroud)

undef返回时,我们将得到Use of uninitialized value while eq at ...,我们应该这样做:

(reftype($data) //'') eq 'HASH'
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 5

一般而言,输入错误会导致undef(如果不是例外),最终会导致警告,从而可以发现错误。

最具争议的警告是未初始化的警告,因为没有立即的收益。但是当人们认为它是更大的错误框架的一部分时,就意识到它是Perl错误检测和调试系统的关键组成部分。让函数在输入错误时返回undef是该系统的另一个组件。

我对您的主张使代码更小表示怀疑。对于初学者来说,永远不要使用reftype它,因为它会破坏Perl的数据模型。(这就是为什么keys $ref它总是一个坏主意,并且从未超过实验阶段的原因。)这意味着所讨论的代码量很小。

但是,只要保证一定的限制,就可以产生需要使用的数据。(例如,decode_jsoncan 的输出要求使用它,并且可以安全地使用它,因为它decode_json永远不会产生对象或魔术变量。)当需要使用它时,通常会执行许多检查,因此返回空字符串实际上并不会救命。

my $type = reftype($val);
if (!defined($type)) { ... }
elsif ($type eq 'HASH') { ... }
elsif ($type eq 'ARRAY') { ... }
...
Run Code Online (Sandbox Code Playgroud)

请注意,更改reftype将破坏此代码,因此更改reftype不是一种选择。我要说的是,您可以向作者要求一个替代子,该子以您想要的方式运行,但是您也可以自己轻松地生成该子。