ref
为标量值返回空字符串。
为什么Scalar::Util::reftype
返回undef
而不是像ref
那样的空字符串呢?
undef
有什么好处?相比之下,空字符串的好处在于执行以下操作时编码较少:
reftype $data eq 'HASH'
当undef
返回时,我们将获得Use of uninitialized value while eq at ...
,我们应该这样做:
(reftype($data) //'') eq 'HASH'
一般来说,错误的输入导致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
不是一种选择。我打算说你可以向作者询问一个行为符合你想要的替代子,但你可以自己轻松地制作那个子。