Перемещение хэша в существующий хэш в Perl

Я новичок в Perl, так что простите мой код.

Я читаю файл с древовидной структурой (например, xml, но не на самом деле), и я хочу foreach пройти по дереву, и если у определенного «узла» нет дочернего узла, я хочу его вставить. Достаточно просто.

Вот мой код:

foreach $key ( @{$struct->{'transferBatch'}->{'callEventDetails'} } ) {

    foreach ( keys %{$key} ) {

        if ( $_ eq "mobileTerminatedCall" ) {

            if ( defined $key->{$_}->{'basicServiceUsedList'} ) {

                if ( defined $key->{$_}->{'basicServiceUsedList'}[0]->{'chargeInformationList'} ) {

                    if ( not defined $key->{$_}->{'basicServiceUsedList'}[0]->{'chargeInformationList'}[0]->{'CallTypeGroup'} ) {

                        $CallTypeGroup = {                          
                                "CallTypeLevel1:" => "0",
                            "CallTypeLevel2:" => "0",
                            "CallTypeLevel3:" => "0"

                        };                          

                        #Doesn't work! 
                        $key->{$_}->{'basicServiceUsedList'}[0]->{'chargeInformationList'}[0]{'CallTypeGroup'} =  $CallTypeGroup;
                    }
                }
            }
        }
    }
}

Итерация работает нормально, но мой вызов push не работает, говоря, что это не ссылка на МАССИВ. Я чувствую, что я близок, но мне нужна эта строка, чтобы вставить хэш $CallTypeGroup в качестве дочернего элемента в текущее место.

Любая помощь приветствуется!


person OnResolve    schedule 21.09.2012    source источник
comment
Используйте ссылки для хранения сложных структур данных в виде скаляров.   -  person m0skit0    schedule 21.09.2012


Ответы (1)


$key->{$_}->{'basicServiceUsedList'}[0]->{'chargeInformationList'}[0]

содержит ссылку на хэш, созданный здесь (если не ранее):

if ( not defined
   $key->{$_}{basicServiceUsedList}[0]
      ->{chargeInformationList}[0]
         ->{CallTypeGroup} )

Вы не указали, какую структуру данных вы хотите, поэтому я не уверен, чем мы можем помочь, кроме как объяснить сообщение. Я думаю, что вы просто хотите изменить это if на

if ( not defined
   $key->{$_}{basicServiceUsedList}[0]
      ->{chargeInformationList}[0] )

Кстати, вам действительно следует использовать переменные для хранения промежуточных ссылок вместо таких длинных «имен».

Кстати, я очень скептически отношусь ко всем этим жестко запрограммированным нулевым индексам.

person ikegami    schedule 21.09.2012
comment
Оператор if работает по назначению, а это означает, что если CallTypeGroup не определена как дочерняя, мне нужно добавить ее. Нули остаются заполнителями до тех пор, пока я не пройду цикл, на данный момент я просто хотел получить рабочий прототип. - person OnResolve; 21.09.2012
comment
Я не говорил, что это не так. Я сказал, что не могу знать, если вы не скажете нам, какую структуру данных вы хотите. - person ikegami; 21.09.2012
comment
$key->{$_}->{'basicServiceUsedList'}[0]->{'chargeInformationList'}[0] — это хэш, поэтому я хочу добавить CallTypeGroup, который также является хешем в качестве дочернего элемента. - person OnResolve; 21.09.2012
comment
@OnResolve, push добавляется в массив. Может быть, ->{CallTypeGroup} не хватает в push? - person ikegami; 21.09.2012
comment
дох! ну, это подтверждает сообщение об ошибке, которое я получаю :-P. Итак, я обновил свой вопрос, чтобы отразить добавление к хэшу, но, хотя я не получаю сообщения об ошибке, хэш, похоже, не изменился. - person OnResolve; 21.09.2012
comment
Или, может быть, вы хотите key->{$_}{basicServiceUsedList}[0]{chargeInformationList}[0] = $CallTypeGroup; (заменив пустой хеш, который вы создали двумя строками ранее). - person ikegami; 21.09.2012
comment
Добавьте хэш к чему. Мы знаем, что вы хотите добавить хэш, но к чему? В третий раз, если вы хотите пойти дальше, нам нужно знать, какую структуру данных вы хотите. - person ikegami; 21.09.2012
comment
Я думал, что уже объяснил это, но $key->{$_}->{'basicServiceUsedList'}[0]->{'chargeInformationList'}[0] - это хэш, более того, он встроен в сам хэш (концепция дерева, о которой я говорил в вопросе). Я просто хочу добавить 1 пару значений ключа к уже существующему хешу $key->{$_}->{'basicServiceUsedList'}[0]->{'chargeInformationList'}[0]. Пара ключ-значение, которую я хочу добавить, — это CallTypeGroup. Имейте в виду, что это мое первое приключение с perl. - person OnResolve; 21.09.2012