删除键/ val哈希对会留下键.为什么?

dma*_*rra -2 perl hash

请考虑以下代码:

$foo{'bar'}->{'lala'} = "lol";
delete($foo{'bar'}->{'lala'});
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我希望"lala"条目完全消失(键和值).但是,当我使用Dumper转储此哈希时,它看起来像这样:

$foo => {
    'bar' => {
        'lala' => {}
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么钥匙留在后面?我想删除值和键.以下是实际相关代码和结果.

用于删除的代码:

delete( $state->{calls}->{$call_id} );
Run Code Online (Sandbox Code Playgroud)

输出之前:

$VAR1 = bless( {
  'packet' => {},
  'calls' => {
    ' 1330718109168
' => {
      'eventcount' => 0,
      'caller_id_name' => ' 
',
  '    channels' => [
        ' 1330718109168
'
      ],
      'entered_time' => 1330718109,
      'caller_id_num' => ' 
'
    },
    ' 1330718097167
' => {
      'eventcount' => 277,
      'caller_id_name' => ' Cell Phone   NY
',
      'channels' => [
        ' 1330718097167
'
      ],
      'queue' => ' TEST_HUD_AMIEV
',
      'entered_time' => 1330718097,
      'caller_id_num' => ' 5555555
'
    }
}, 'main' );
Run Code Online (Sandbox Code Playgroud)

输出后:

$VAR1 = bless( {
  'packet' => {},
  'calls' => {
    ' 1330718097167
' => {},
    ' 1330718109168
' => {}
}, 'main' );
Run Code Online (Sandbox Code Playgroud)

Zai*_*aid 6

我无法重现这个问题(Perl 5.14.2):

use strict;
use warnings;
use Data::Dumper;

my %foo;
$foo{bar}->{lala} = 'lol';
delete( $foo{bar}->{lala});
print Dumper \%foo;
Run Code Online (Sandbox Code Playgroud)

产量

$VAR1 = {
          'bar' => {}
        };
Run Code Online (Sandbox Code Playgroud)

  • 应该是5.8.9,5.10.0,5.10.1中的相同输出. (2认同)