我正在处理Perl中哈希的哈希,我遇到了一些问题。在我的代码运行一段时间后,它会生成一个散列哈希,看起来像这样:
my %book = (
+1 => {
27 => 100,
24 => 1000,
},
-1 => {
30 => 200,
31 => 500,
}
);
在处理了更多数据之后,代码最终通过使用以下代码行删除了两个哈希条目:
delete $book{-1}{30};
delete $book{-1}{31};
因此,哈希应该是半空的。但是,稍后在我的代码中运行以下if语句:
if ((defined $book{+1}) && (defined $book{-1})){
do A
}else{
do B
}
我的代码最终会执行“事物A”而不是“事物B”,因为哈希的“-1”侧已被删除,所以他应该这样做。这怎么可能?而且,最重要的是,如何解决这个问题?
答案 0 :(得分:5)
删除%{$books{-1}}
中的两个条目后,哈希引用$books{-1}
仍然存在,即使它是空的。
use strict;
use warnings;
my %book = (
+1 => {
27 => 100,
24 => 1000,
},
-1 => {
30 => 200,
31 => 500,
}
);
delete $book{-1}{30};
delete $book{-1}{31};
use Data::Dump;
dd \%book;
输出:
{ -1 => {}, 1 => { 24 => 1000, 27 => 100 } }
如果您想修剪该条目,则必须为该
编写明确的逻辑# Trim Hash
my @empty_keys = grep {!%{$book{$_}}} keys %book;
delete $book{$_} for @empty_keys;
<强>更新强>
正如ysth建议的那样,一种替代解决方案是测试是否有任何散列键是空的:
if (! grep {!$book{$_} || !%{$book{$_}}} qw(1 -1)) {
print "A\n";
} else {
print "B\n";
}
答案 1 :(得分:0)
我不想删除多余的哈希元素,而是希望使用%book
的代码对空哈希具有弹性,这一般不是很难做到
我也非常谨慎使用带数字键的哈希,因为有许多字符串可以表示相同的数字。例如,虽然'1' == '1.0'
true ,但'1' eq '1.0'
false ,如果这些值用作哈希键,则它们会引用不同的元素< / p>
有了这些附带条件,我会写下以下内容
很抱歉,我目前只有一台平板电脑可以使用,而且IDE不允许我复制输出文本以粘贴到这里。但它经过测试和运作
use strict;
use warnings;
my %book = (
+1 => {
27 => 100,
24 => 1000,
},
-1 => {
30 => 200,
31 => 500,
}
);
# $book{-1} becomes an empty hash
delete $book{-1}{30};
delete $book{-1}{31};
# remove elements that have no content
for (keys %book) {
delete $book{$_} unless keys %{ $book{$_} };
}
use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper \%book;