我正在处理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

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

2回复

Perl定义未定义的键

以下代码打印Key defined 3 。 为什么Perl定义密钥ABC ? 我期望这三项检查都是错误的。我做错了什么?
1回复

Perl中的变量$ self未定义

我正在编写一个Perl脚本,该脚本利用了Perl模块Module.pm。 Module.pm就像这样: 我这样称呼它: 但是我在第#行不断收到致命错误(在Module.pm)未定义的对象。 这是为什么? 此外,如果我删除了getInfo()子例程中的第一个注释,并在
2回复

Geo IP查找上的Perl未定义错误

我正在使用Geo::IP在ip地址上执行位置查找。 一切正常,直到我遇到不在geo ip查找数据库中的ip地址,并且程序突然关闭,出现此错误 当前代码如下所示 关于如何绕过这个有什么建议吗? 直到找到未在该模块中定义的ip地址之前,它都可以正常工作。
2回复

File :: Find :: Rule :: LibMagic:是否可以保留未定义值的选项?

是否可以保留未定义值的选项(在这种情况下为“ maxdepth”)? 还是我应该这样写:
1回复

无法在未定义的值上调用方法“ setValue”-Perl

错误:“无法在C:/ Dwimperl / perl / site / lib / HTML / HTML5 / Parser / TagSoupParser.pm第2946行的未定义值上调用方法“ setValue” 我尝试过先插入一个if并定义值,但是它不起作用。 我正开始学习
2回复

未定义的子程序&package ::子程序在行调用

我正在调试此脚本,在工作中-老板说该脚本曾经在Solaris上运行,但是由于他们切换到了Linux,因此该脚本停止了工作。 我必须用严格的警告来重写它。 运行它时出现错误: 这是脚本(部分内容) 该脚本使用require语句,我猜想调用脚本创建者构建的例程。 对于此脚本的目
2回复

在Perl中,值是否可以未初始化,但仍然是定义的?

在win32上运行ActiveState Perl 5.10.1。 这段代码怎么样: ...死于1 ,而改变同一行说这个: ...死Use of uninitialized value in die ? 如何defined尚未uninitialized ? 我认为未
2回复

在Perl v5.14.2中找到模式后未定义反向引用

我发现奇怪的是,反向引用($ 1,$ 2,$ 3)在我的原始代码中不起作用,因此我从网络上运行了此示例: 这只给了我: 为什么在找到模式后仍未定义反向引用? 我正在使用Wubi(Ubuntu 12.04 64位),而我的Perl版本是5.14.2。 预先感谢您的帮助。
4回复

什么时候可以在perl中使用未定义的变量并启用警告?

启用警告后,perl通常会打印Use of uninitialized value $foo如果在表达式中使用了$foo并且没有为其分配值,但在某些情况下它是正常的,并且该变量被视为false , 0或''没有警告。 在没有警告的情况下可以使用未初始化/未定义的变量的情况是什么?
2回复

如何从哈希中删除未定义的键?

尝试使用map和grep找出答案,知道什么地方出错了吗? 当我尝试打印新哈希值时,我不断收到“不能使用字符串(“ 10”)作为哈希引用,而“严格引用”错误 在这里使用... 在这种情况下,通过邮寄提交表单时未定义的参数仍显示为key1 =&key2 =,因此scrub取消了em