删除但仍然定义?

g_p*_*ffo 0 perl hash undefined

我正在处理Perl中哈希的哈希,我遇到了一些问题.在我的代码运行一段时间后,它会生成一个散列哈希,看起来像这样:

my %book = (
    +1 => {
        27 => 100,
        24 => 1000,
    },
    -1 => {
        30 => 200,
        31 => 500,
    }
);
Run Code Online (Sandbox Code Playgroud)

在处理了一些更多的数据之后,代码最终通过使用以下代码行删除了两个哈希条目:

delete $book{-1}{30};
delete $book{-1}{31};
Run Code Online (Sandbox Code Playgroud)

因此,哈希应该是半空的.但是,稍后在我的代码中运行以下if语句:

if ((defined $book{+1}) && (defined $book{-1})){
    do A
}else{
    do B
}
Run Code Online (Sandbox Code Playgroud)

我的代码最终做了"事物A"而不是"事物B",他应该这样做,因为哈希的"-1"侧已被删除.这怎么可能?而且,最重要的是,如何解决这个问题?

Mil*_*ler 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;
Run Code Online (Sandbox Code Playgroud)

输出:

{ -1 => {}, 1 => { 24 => 1000, 27 => 100 } }
Run Code Online (Sandbox Code Playgroud)

如果您想修剪该条目,则必须为此编写明确的逻辑

# Trim Hash
my @empty_keys = grep {!%{$book{$_}}} keys %book;
delete $book{$_} for @empty_keys;
Run Code Online (Sandbox Code Playgroud)

更新

正如ysth建议的那样,一种替代解决方案是测试是否有任何散列键是空的:

if (! grep {!$book{$_} || !%{$book{$_}}} qw(1 -1)) {
    print "A\n";
} else {
    print "B\n";
}
Run Code Online (Sandbox Code Playgroud)