Как я могу преобразовать один хэш Perl в другой, используя ключи? - PullRequest
3 голосов
/ 23 марта 2010

Я только что начал погружаться в безумный мир, который является 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",
                              } 
                  } 

);

И да, я хочу, чтобы данные second_key повторялись в final_hash, так как будет введен массив original_hashes. Первый элемент становится базовым, и все остальные элементы могут добавляться или удаляться из этого списка.

Если у кого-нибудь есть какие-либо предложения о том, как это сделать, это будет очень признательно!

Ответы [ 2 ]

2 голосов
/ 23 марта 2010

Вот еще один способ

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);
2 голосов
/ 23 марта 2010

Хорошо, Синан прав, очень трудно угадать вашу проблему, но следующий код, кажется, делает то, что вы хотите ... или, по крайней мере, он производит перечисленный вывод ....:)

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);
...