Удаление пары ключ / вал хэш оставляет ключ.Зачем? - PullRequest
0 голосов
/ 02 марта 2012

Рассмотрим следующий код:

$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 ]

6 голосов
/ 02 марта 2012

Я не могу воспроизвести проблему (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' => {}
        };
0 голосов
/ 02 марта 2012

Обновленный ответ на обновленный вопрос:

Я очистил ваш пример ввода для этого (с экранированием конца строки, чтобы его можно было скопировать / вставить в отладчик):

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...