将哈希值推送到Perl中的现有哈希值

时间:2012-09-21 17:45:31

标签: perl hash push

我是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调用失败,说它不是ARRAY引用。我觉得我很接近,但我需要该行将$CallTypeGroup哈希作为孩子插入到当前位置。

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

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

包含对哈希的引用,如此处创建的(如果不是更早):

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

您没有说明您想要的数据结构,所以我不确定除了解释消息之外我们可以提供哪些帮助。我认为您只想将if更改为

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

不过,你真的应该使用变量来保存中间引用,而不是拥有这么长的“名字”。

不过,我对所有那些硬编码的零指数都持怀疑态度。