0

在 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(%hvac_codes);

和(基于这个问题的答案

print dumper(\%hvac_codes);

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

4

1 回答 1

3

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

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

您还可以使用defined测试与键对应的值的定义性。

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

如果键不存在,它仍然返回 false;但它也为分配值为undef的键返回 false :

undef $hvac_codes{key_with_undef_value};

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

于 2020-05-17T20:11:00.583 回答