2012-03-02 123 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