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

前端之家收集整理的这篇文章主要介绍了perl – 为什么我的哈希不是undef?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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 returned\n"
} elsif (
  scalar keys %Metadata == 1 and
  exists $Metadata{''} and
  !defined $Metadata{''}
) {
  print "undef or '' was returned\n";
} else {
  print "A hash was hopefully returned\n";
}

您可以使用以下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

快乐的黑客

猜你在找的Perl相关文章