2013-05-16 95 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」和「爲」鑰匙? –

+0

在一種情況下,你使用'ab'的關鍵。另一方面,你用'as'。關於哪個值應該用作新散列中的鍵值的決定因素是什麼? – ikegami

回答

0

首先,你已經在你的問題中包含了無關的東西。

的問題是有關從

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

轉換VAR($input->{e}{f}{g})的值到

{ 
    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} } 
};