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

问题描述 投票:0回答:1

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

use strict;
use warnings;

这个代码(基于 本题的公认答案 由 @Jeef )是一个 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哈希中,即使它们已经被添加了。(由 print 证明)

我想看看哈希最后是如何确定每段代码是否因为测试错误而被当作未定义处理,或者是赋值到哈希中不起作用。我尝试了dumper两种方式。

print dumper(%hvac_codes);

和(基于... 本题答案)

print dumper(\%hvac_codes);

在这两种情况下,自卸车线路都会出现故障。Global symbol "%hvac_codes" requires explicit package name 错误,即使 my %hvac_codes; 是存在的。目前,我已将其注释出来。

perl hash data-dumper
1个回答
3
投票

在Perl中,哈希中的键要么存在,要么不存在。要检查一个键是否存在,使用 存在.

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

你也可以使用以下方法测试键对应的值的定义性 确定的.

if (defined $hvac_codes{$hvac_string}) { ...

如果键不存在,它仍然返回false;但对于赋值为 无防御:

undef $hvac_codes{key_with_undef_value};

注意: Data::Dumper 出口 Dumper,不 dumper. Perl是区分大小写的。

© www.soinside.com 2019 - 2024. All rights reserved.