0

以下のフォーム ($output を参照) に変換する必要がある入力を以下のフォームに入力しました。既存の Q&A を見ましたが、関連するものは見つかりませんでした。

$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
                                            ....
                                            ....
                                         }
                              }}}};
4

1 に答える 1

0

まず第一に、質問に無関係なものが含まれています。

問題は、var( $input->{e}{f}{g})の値を

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

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

不要なビットを削除すると、問題は非常に単純になります。コードは次のようになります。

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} }
};
于 2013-05-16T01:29:42.797 に答える