Удаление пары ключ / вал хэш оставляет ключ. Зачем?
Рассмотрим следующий код:
$foo{'bar'}->{'lala'} = "lol";
delete($foo{'bar'}->{'lala'});
Когда я запускаю этот код, я ожидаю, что запись "lala" полностью исчезнет (ключ и значение). Однако, когда я использую 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' );
2 ответа
Я не могу воспроизвести проблему (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' => {}
};
Обновленный ответ на обновленный вопрос:
Я очистил ваш пример ввода для этого (с выходными данными конца строки, чтобы его можно было скопировать / вставить в отладчик):
$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
Похоже, это работает для меня (Perl 5.10.1 на Cygwin)