我的哈希看起来像这样
%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?
答案 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;
一起运行。清理类型,它应该可以正常工作。