首页 > 解决方案 > 哈希上的“使用未初始化值”消息,但我认为密钥存在

问题描述

我在调试时遇到了一些奇怪的事情。顺便说一句warnprint

foreach my $key (keys %{$changeIdsRelevant})
{
    warn($key); # Icf4e037 is printed once
}
warn((keys %{$changeIdsRelevant})[0]); # Icf4e037 is printed

我想知道密钥Icf4e037持有什么值,所以在第一个块之后打印了以下内容。如您所见,我不确定语法并打印了很多..

warn($changeIdsRelevant->{'Icf4e037'});
warn($changeIdsRelevant->{Icf4e037});
warn($changeIdsRelevant{Icf4e037}); # this one 'gave requires explicit package name' error

前 2 个,他们返回的不是一个值

Use of uninitialized value in warn at <file_path>
Warning: something's wrong at <file_path>

这个if块也没有被执行

if (defined $changeIdsRelevant->{'Icf4e037'}) {
   warn('============================================================');
};

是否说密钥Icf4e037存在但其值未定义?但我觉得世界上每把钥匙都可以这么说。有谁知道为什么它仍然返回Icf4e037 keys <hash>

标签: perl

解决方案


散列中可以存在键,但其值可以是undef

$h->{key} = undef;
warn $h->{key};  # Use of uninitialized value...

无论值如何,您都可以使用exists检查是否存在:

if (exists $h->{key}) {
    warn "key exists.";
    if (defined $h->{key}) {
        warn "Its value is defined.";
        if ($h->{key}) {
            warn "Its value is true.";
        }
    }
}

推荐阅读