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 区分大小写。
在 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 falseundef $hvac_codes{key_with_undef_value};
请注意 Data::Dumper 导出 Dumper
,而不是 dumper
。 Perl 区分大小写。