[英]Deleted but still defined?
我正在处理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”侧已被删除。 这怎么可能? 而且,最重要的是,如何解决这个问题?
删除%{$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";
}
与其删除多余的哈希元素,不如使使用%book
的代码具有弹性以消除空哈希,这通常并不难
我也会非常警惕使用带数字键的哈希,因为有很多字符串可以表示相同的数字。 例如,虽然'1' == '1.0'
为true ,但'1' eq '1.0'
为false ,如果将值用作哈希键,它们将引用不同的元素
有了这些条件,我将写以下内容
很抱歉,目前我只能使用平板电脑,并且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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.