Perl:确定键是否在哈希中的意外结果

Perl: unexpected results determining if a key is in a hash

在 Windows 10 x64 上使用 Perl v5.22.1。 我已经设置

use strict;
use warnings;

此代码(基于@Jeef 的accepted answer in this question)是解析文件的while 循环的一部分。它静静地退出:

my %hvac_codes;   # create hash of unique HVAC codes
#Check the hash to see if we have seen this code before we write it out
if ( $hvac_codes{$hvacstring}  eq 1)  {
    #Do nothing - skip the line
} else {
  $hvac_codes{$hvacstring} = 1;  
}

如果我这样改

my %hvac_codes;   # create hash of unique HVAC codes
#Check the hash to see if we have seen this code before we write it out
if ( defined $hvac_codes{$hvacstring} )  {
    #Do nothing - skip the line
} else {
  $hvac_codes{$hvacstring} = 1;  
  print (" add unique code $hvacstring \n");
}

它不会静默退出(也很好奇为什么静默退出而不是在未定义的引用上出错)但没有按预期工作。每个 $hvacstring 都会添加到 %hvac_codes 散列中,即使它们已被添加。 (如打印所示)

我想看看散列是如何结束的,以确定是否每个代码都被视为未定义,因为测试是错误的,或者对散列的赋值不起作用。我用两种方式尝试了 dumper:

print dumper(%hvac_codes);

和(基于

print dumper(\%hvac_codes);

在这两种情况下,即使存在 my %hvac_codes;,转储程序行也会因 Global symbol "%hvac_codes" requires explicit package name 错误而失败。现在我已经把它注释掉了。

在 Perl 中,散列中的键存在或不存在。要检查密钥是否存在,请使用 exists.

if (exists $hvac_codes{$hvacstring}) { ...

您还可以使用 defined.

测试与键对应的值的定义性
if (defined $hvac_codes{$hvac_string}) { ...

如果密钥不存在,它仍然returns false;但对于分配值为 undef:

的键,它也是 returns false
undef $hvac_codes{key_with_undef_value};

请注意 Data::Dumper 导出 Dumper,而不是 dumper。 Perl 区分大小写。