2013-05-16 9 views
0

아래 입력 형식을 사용하여 변환해야합니다 ($ 출력 참조). 기존 Q 모양을 보았습니다 & 마찬가지로 관련이 없으므로 다른 사람을 찾을 수 있습니까? 이 문제를 해결하도록 도와 주시겠습니까?복잡한 배열/해시

$input = { 
      a => b, 
      c => d, 
      e => { 
        f => { 
         g => [ 
           { 
            ab => 1111, 
            ef => 3333 
            .... 
            .... 
           }, 
           { 
            fd => 2222, 
            as => 5555 
            .... 
            .... 
           } 
           . 
           . 
           . 
           ] } } }; 

$output = { 
      a => b, 
      c => d, 
      e => { 
        f => { 
         g => { 
           1111 => { 
              ef => 3333 
              .... 
              .... 
              } 
           5555 => { 
              fd => 2222 
              .... 
              .... 
             } 
           }}}}; 
+1

그래서 'g' 요소를 해시 배열에서 해시 해시로 변경해야합니다. 맞습니까? 마지막 해시의 어떤 요소가 새 해시의 키가 될지를 결정하는 기준은 무엇입니까? 지금까지 시도한 코드를 게시하십시오 - 코드를 수정하는 데 도움이됩니다. 코드는 작성하지 않습니다. – Barmar

+0

'ab'와 'as'의 키는 무엇이 특별합니까? –

+0

하나의 경우'ab'를 키로 사용했습니다. 다른 쪽에서는'as '를 사용했습니다. 어떤 값이 새로운 해시의 키로 사용되어야하는지에 대한 결정 요인은 무엇입니까? – ikegami

답변

0

우선, 질문에 관련성없는 항목을 포함 시켰습니다.

문제는 문제가 매우 간단하게 제거 불필요한 비트

{ 
    1111 => { 
     ef => 3333, 
     ... 
    }, 
    5555 => { 
     fd => 2222, 
     ... 
    }, 
    ... 
} 

[ 
    { 
     ab => 1111, 
     ef => 3333, 
     ... 
    }, 
    { 
     fd => 2222, 
     as => 5555, 
     ... 
    }, 
    ... 
] 

에서 VAR ($input->{e}{f}{g})의 값을 변환하는 방법에 대한 것이다. 코드는 다음과 같다 것입니다 : 키 필드의 이름이 일정 특히 경우

my %keyed_recs; 
for my $rec (@{ $input->{e}{f}{g} }) { 
    my $key_field = ...; # 'ab' or 'as' 
    my $key = delete($rec->{$key_field}); 
    $keyed_recs{$key} = $rec; 
} 

$input->{e}{f}{g} = \%keyed_recs; 

, map은 간결 사용할 수 있습니다.

$input->{e}{f}{g} = { 
    map { delete($_->{id}) => $_ } 
     @{ $input->{e}{f}{g} } 
};