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

===============>>#1 票数: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";
}

===============>>#2 票数:0

与其删除多余的哈希元素,不如使使用%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;

  ask by g_puffo translate from so

未解决问题?本站智能推荐: