2

我的哈希看起来像这样

%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?

4

2 回答 2

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}.

于 2013-04-25T21:30:49.077 回答
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" };

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

于 2013-04-25T21:10:24.310 回答