2012-03-02 124 views
-2

考虑下面的代码:删除密钥/ val哈希对留下密钥。为什么?

$foo{'bar'}->{'lala'} = "lol"; 
delete($foo{'bar'}->{'lala'}); 

当我运行这段代码,我预计“拉拉”条目被完全消失(key和value)。但是,当我使用Dumper转储这个散列时,它看起来像这样:

$foo => { 
    'bar' => { 
     'lala' => {} 
    } 
} 

为什么关键在后面?我想要删除值和密钥。以下是实际的相关代码和结果。

代码用于删除:

delete($state->{calls}->{$call_id}); 

输出前:

$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'); 

后输出:

$VAR1 = bless({ 
    'packet' => {}, 
    'calls' => { 
    ' 1330718097167 
' => {}, 
    ' 1330718109168 
' => {} 
}, 'main'); 
+6

请发布确切的程序和输出。你显示的程序将删除'lala'键。你所显示的输出并不完全是Data :: Dumper所能产生的。 – 2012-03-02 19:51:56

+1

增强了问题以获得更多真实结果,以及我正在使用的真实删除语句。 – dmarra 2012-03-02 20:10:31

+0

The BEFORE snippet is missing a'}' – 2012-03-02 21:04:49

回答

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; 

输出

$VAR1 = { 
      'bar' => {} 
     }; 
+2

5.8.9,5.10.0,5.10.1应该是相同的输出。 – 2012-03-02 19:55:01

+0

同上。我也无法用Perl 5.10.0重现这个问题。 – 2012-03-02 19:56:35

+0

“Lala”在WinXP的ActiveState 5.8.8中不见了。 – 2012-03-03 07:33:53

0

更新答案更新的问题:

我清理你的样品输入到这个(与线端逃逸因此它可以复制/粘贴到调试器):

$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') 

下面是我在调试器中得到:

DB<85> x $VAR1 
0 main=HASH(0x108d0a58) 
    'calls' => HASH(0x108d09f8) 
     1330718097167 => HASH(0x108d0938) 
     'caller_id_name' => 'Cell Phone NY' 
     'caller_id_num' => 5555555 
     'channels' => ARRAY(0x108d08f0) 
      0 1330718097167 
     'entered_time' => 1330718097 
     'eventcount' => 277 
     'queue' => 'TEST_HUD_AMIEV' 
     1330718109168 => HASH(0x108d0848) 
     'caller_id_name' => '' 
     'caller_id_num' => '' 
     'channels' => ARRAY(0x108d07b8) 
      0 ' 1330718109168' 
     'entered_time' => 1330718109 
     'eventcount' => 0 
    'packet' => HASH(0x108c4408) 
     empty hash 
    DB<86> delete $VAR1->{calls}->{'1330718097167'} 

    DB<87> delete $VAR1->{calls}->{'1330718109168'} 

    DB<88> x $VAR1 
0 main=HASH(0x108d0a58) 
    'calls' => HASH(0x108d09f8) 
     empty hash 
    'packet' => HASH(0x108c4408) 
     empty hash 

看起来像是在为我工作(Cygwin上的Perl 5.10.1)

+0

这是非常翔实的。不幸的是,我原来的问题有不好的代码示例。事实证明,我已经在使用$ foo - > {'bar'} - > ['lala'}约定。 – dmarra 2012-03-02 20:09:16