2012-09-21 52 views
0

我是新来的Perl,所以你必须原谅我的代码。我正在阅读树结构(如xml,只是不是实际)的文件,并且我想通过树并且如果某个“节点”没有子节点,我想插入它。够简单。将哈希推送到Perl中的现有哈希

这里是我的代码:

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散列作为孩子插入到当前位置。

任何帮助表示赞赏!

+0

使用引用将复杂数据结构存储为标量。 – m0skit0

回答

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

包含一个散列的引用,如在这里创建(如果不是更早):

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

你没有表明自己想要的数据结构,所以我不知道我们如何能帮助除了解释信息。我认为你只是想改变这种if

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

顺便说一句,你真的应该使用变量来持有,而不必如此长的“名”的中间引用。

顺便说一句,我非常怀疑所有这些硬编码零指数。

+0

if语句按照预期工作,这意味着如果“CallTypeGroup”没有被定义为孩子,我需要添加它。直到我循环完成之前零都是占位符,截至目前我只想得到一个工作原型。 – OnResolve

+0

我没有说没有。我说我不知道​​你是否不告诉我们你想要什么数据结构。 – ikegami

+0

'$ key - > {$ _} - > {'basicServiceUsedList'} [0] - > {'chargeInformationList'} [0]'是一个散列,所以我想添加'CallTypeGroup',这也是一个散列一个孩子。 – OnResolve