我在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
快乐的黑客