ref
返回标量值的空字符串。
为什么Scalar::Util::reftype
返回undef
而不是像ref
这样的空字符串?
undef
有什么好处?相比之下,空字符串的好处是执行时减少了编码:
reftype $data eq 'HASH'
返回undef
后,我们将得到Use of uninitialized value while eq at ...
,我们应该这样做:
(reftype($data) //'') eq 'HASH'
答案 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
是不可选项。我要说的是,您可以要求作者提供一个替换子,该子以您想要的方式运行,但是您也可以自己轻松地生成该子。