从Perl中的2D哈希删除密钥

时间:2013-04-25 21:03:59

标签: perl hash key 2d

我的哈希看起来像这样

%hIDSet = (
      'TSASD2' => {
                    'country' => 'US',
                    'newid' => 'IMRAN',
                    'oldid' => 'TSASD4'
                  }

      'TS767' => {
                   'country' => 'DE',
                   'newid' => 'B90LKT',
                   'oldid' => '432553'
                 },
    );

当我做的时候

my $sID = "TSASD2";
delete $hIDSet{$sID};

我得到的输出是

%hIDSet = (
  'TSASD2' => {},
  'TS767' => {
               'country' => 'DE',
               'newid' => 'B90LKT',
               'oldid' => '432553'
             },
);

我的问题是为什么不会完全删除ID?

2 个答案:

答案 0 :(得分:4)

您确实删除了密钥,因此您必须在重新转储哈希之前重新创建密钥,如下面的代码段所示:

my $sID = "TSASD2";
my %hIDSet = ( $sID => {} );
delete $hIDSet{$sID};
print(Dumper(\%hIDSet));  # It's gone
if ($hIDSet{$sID}{foo}) { '...' }
print(Dumper(\%hIDSet));  # You've recreated it.

请记住

$hIDSet{$sID}{foo}

的缩写
$hIDSet{$sID}->{foo}

那个

EXPR->{foo}

装置

( EXPR //= {} )->{foo}

所以

$hIDSet{$sID}{foo}

装置

( $hIDSet{$sID} //= {} )->{foo}

请注意,这可以分配给$hIDSet{$sID}

答案 1 :(得分:3)

无法重现。

你混淆了Perl哈希和hashref文字的语法。这表示hashref:

use Data::Dumper;
my $hashref = {
  foo => 'bar', # ← note comma between items
  baz => 'qux',
};
delete $hashref->{foo};
print Dumper $hashref;
# $VAR1 = { baz => "qux" };

另一方面,哈希只是列表:

use Data::Dumper;
my %hash = ( # note parens
  foo => 'bar',
  baz => 'qux',
);
delete $hash{foo};
print Dumper \%hash;
# $VAR1 = { baz => "qux" };

由于缺少逗号,您提供的代码不应编译,并且由于hash-hashref不匹配而无法与use strict; use warnings;一起运行。清理类型,它应该可以正常工作。