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

问题描述 投票:3回答:1

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

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

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

reftype $data eq 'HASH'

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

(reftype($data) //'') eq 'HASH'
perl
1个回答
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不是一种选择。我打算说你可以向作者询问一个行为符合你想要的替代子,但你可以自己轻松地制作那个子。

© www.soinside.com 2019 - 2024. All rights reserved.