删除但仍然定义?

时间:2014-04-20 00:20:20

标签: perl hash undefined

我正在处理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”侧已被删除,所以他应该这样做。这怎么可能?而且,最重要的是,如何解决这个问题?

2 个答案:

答案 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;