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

时间:2019-04-23 16:53:55

标签: perl

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

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

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

reftype $data eq 'HASH'

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

(reftype($data) //'') eq 'HASH'

1 个答案:

答案 0 :(得分:5)

通常来说,输入错误会导致undef(如果不是例外),(最终)会导致警告,以便可以发现错误。

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

我对您的主张使代码更小提出异议。对于初学者来说,永远不要使用reftype,因为它会破坏Perl的数据模型。 (这就是keys $ref始终是一个坏主意,并且从未超过实验阶段的原因。)这意味着所涉及的代码量很小。

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

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

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