2010-03-23 4 views
3

저는 방금 perl 인 미친 세상으로 잠입하기 시작했고 내 머리를 감쌀 수없는 문제에 직면했습니다. 특히, 새로운 해시 키/값으로 키/값을 사용하는 한 해시 구조에서 다른 해시 구조로 변환 할 수 있어야합니다. 키를 사용하여 한 Perl 해시를 다른 해시로 변환하는 방법은 무엇입니까?

예 :

입력 해시 :

my %original_hash = (
    first_key => { some_key => "apples", 
        another_key => "chips", 
        #potentially more here 
       }, 
    second_key => { more_of_same => "dogs", 
         its_another => "cats", 
         #potentially more here 
        } 
    ); 

출력 해시 :

my %final_hash = ( 
    some_key => { 
        apples => { 
           more_of_same => "dogs", 
           its_another => "cats", 
           } 
       } , 
    another_key => { 
        chips => { 
           more_of_same => "dogs", 
           its_another => "cats", 
           } 
        } 

);

그리고 나는 입력 된 original_hashes의 배열이있을 것이므로 second_key의 데이터가 final_hash에서 반복되도록하고 싶습니다. 첫 번째 요소는 기본 사례가되며 다른 모든 요소는 해당 목록에 추가되거나 제거 될 수 있습니다.

누구든지이 작업을 수행하는 방법에 대한 제안 사항이 있으면 크게 감사하겠습니다.

+3

시도이다. –

답변

2

는 여기에 문제의 정확한 사양보다는 다른 하나 개의 데이터 구조에서 매핑을 파악하는 것은 매우 어렵다 느슨한 예를 가지고 올 수있는 또 다른 방법

my %final_hash; 

my %tmp = %{$original_hash{first_key}}; 
my $val = $original_hash{second_key}; 

while (my ($k,$v) = each %tmp) { 
    $final_hash{$k} = { $v => $val }; 
} 


print Dumper (\%final_hash); 
+0

오. 흥미 롭 군. 각 기능을 포함시켜 이런 식으로하는 것의 장점은 무엇입니까? – Zack

+0

퍼포먼스의 관점에서, 나는 무시할 것이다. 펄의 모토는 TIMTOWTDI이다. http://en.wikipedia.org/wiki/There's_more_than_one_way_to_do_it – ccheneson

+1

왜'리버스 '인가? 그냥'$ k'와'$ v'를 루프 안에 넣으면됩니다. – codeholic

2

좋아, 신안이 ....이 문제를 추측하는 것은 매우 어렵지만, 다음 코드는 당신이 원하는 것을 할 것 같다 ... 적어도이 나열된 출력을 생성, 우측됩니다 :)

use strict; 
use warnings; 
use Data::Dumper; 
$Data::Dumper::Deepcopy = 1; 

my %original_hash = (
    first_key => { some_key => "apples", 
        another_key => "chips", 
        #potentially more here 
      }, 
second_key => { more_of_same => "dogs", 
        its_another => "cats", 
        #potentially more here 
       } 
); 


my %final_hash; 

for my $key (keys %{ $original_hash{first_key} }) { 
     $final_hash{$key} = { 
      $original_hash{first_key}->{$key} 
       => $original_hash{second_key} 
      }; 
} 


print Dumper(\%final_hash); 
+0

나는 이것이 내가 찾고있는 것이라고 믿는다. 숟가락으로 정확한 답을 얻는 대신에 일반적인 것을 유지하기를 원했다. 내 구체적인 사례에 적용 할 수 있어야합니다. (그리고 더 자세히 알기를 바랍니다!) 감사합니다. – Zack

관련 문제