加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 为什么我的哈希不是undef?

发布时间:2020-12-15 23:35:24 所属栏目:大数据 来源:网络整理
导读:我在Perl中有以下(从错误中理想化)短脚本: my %metadata = undef;if (defined %metadata){ print "defined";} 由于某种原因,程序的输出总是“定义”.因此,将哈希值设置为“未定义”会使其定义.它被定义为“未定义”吗? 编辑: 这是一个理想化的案例,试图复
我在Perl中有以下(从错误中理想化)短脚本:

my %metadata = undef;
if (defined %metadata)
{
    print "defined";
}

由于某种原因,程序的输出总是“定义”.因此,将哈希值设置为“未定义”会使其定义.它被定义为“未定义”吗?

编辑:

这是一个理想化的案例,试图复制问题.我实际上做的更像是:

my %metadata = my_sub_function();
if (defined %metadata)
{
    print "defined";
}

my_sub_function的输出可能是undef,()或填充的哈希,我只想在最后一种情况下打印“已定义”.

编辑2:

顺便说一句,我发现了

if (scalar(keys %metadata)

行为正确的(),但仍然不适用于undef.

解决方法

如果你的函数返回undef并且undef被置于散列中,则自动字符串化会将undef更改为”,并且最终得到:%metadata =(”=> undef).

如果你的函数需要返回undef,()或正确的哈希,你需要分别测试所有三种情况,我建议:

my %metadata = my_sub_function();
if ( !scalar keys %metadata ) {
  print "An empty list () was returnedn"
} elsif (
  scalar keys %metadata == 1 and
  exists $metadata{''} and
  !defined $metadata{''}
) {
  print "undef or '' was returnedn";
} else {
  print "A hash was hopefully returnedn";
}

您可以使用以下my_sub_functions对其进行测试:

sub my_sub_function { return ()                 } # 1st case
sub my_sub_function { return undef              } # 2nd case
sub my_sub_function { return ( a => 1,b => 2 ) } # 3rd case
sub my_sub_function { return qw/not a hash/     } # unhandled case

快乐的黑客

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读