簡體   English   中英

如何從Perl中的哈希數組創建哈希哈希?

[英]How can I create a hash of hashes from an array of hashes in Perl?

我有一組哈希,都有相同的鍵組,例如:

my $aoa= [
 {NAME=>'Dave', AGE=>12, SEX=>'M', ID=>123456, NATIONALITY=>'Swedish'},
 {NAME=>'Susan', AGE=>36, SEX=>'F', ID=>543210, NATIONALITY=>'Swedish'},
 {NAME=>'Bart', AGE=>120, SEX=>'M', ID=>987654, NATIONALITY=>'British'},
]

我想編寫一個子程序,它將使用給定的鍵層次結構將其轉換為哈希哈希值:

my $key_hierarchy_a = ['SEX', 'NATIONALITY'];
aoh_to_hoh ($aoa, $key_hierarchy_a) = @_;
 ...
}

將返回

{M=>
  {Swedish=>{{NAME=>'Dave', AGE=>12, ID=>123456}},
   British=>{{NAME=>'Bart', AGE=>120, ID=>987654}}}, 
 F=>
  {Swedish=>{{NAME=>'Susan', AGE=>36,  ID=>543210}}
}

請注意,這不僅會創建正確的密鑰層次結構,還會刪除現在的冗余密鑰。

我陷入困境,需要在正確的分層位置創建新的,最內部的哈希。

問題是我不知道“深度”(即鍵的數量)。 如果我有一個常數,我可以這樣做:

%h{$inner_hash{$PRIMARY_KEY}}{$inner_hash{$SECONDARY_KEY}}{...} = filter_copy($inner_hash,[$PRIMARY_KEY,$SECONDARY_KEY])

所以也許我可以編寫一個循環,一次添加一個級別,從散列中刪除該鍵,而不是將剩余的散列添加到“當前”位置,但它有點麻煩,而且我不知道如何保持哈希散列中的“位置”......

use Data::Dumper;

my $aoa= [
 {NAME=>'Dave', AGE=>12, SEX=>'M', ID=>123456, NATIONALITY=>'Swedish'},
 {NAME=>'Susan', AGE=>36, SEX=>'F', ID=>543210, NATIONALITY=>'Swedish'},
 {NAME=>'Bart', AGE=>120, SEX=>'M', ID=>987654, NATIONALITY=>'British'},
];

sub aoh_to_hoh {
  my ($aoa, $key_hierarchy_a) = @_;
  my $result = {};
  my $last_key = $key_hierarchy_a->[-1];
  foreach my $orig_element (@$aoa) {
    my $cur = $result;
    # song and dance to clone an element
    my %element = %$orig_element;
    foreach my $key (@$key_hierarchy_a) {
      my $value = delete $element{$key};
      if ($key eq $last_key) {
        $cur->{$value} ||= [];
        push @{$cur->{$value}}, \%element;
      } else {
        $cur->{$value} ||= {};
        $cur = $cur->{$value};
      }
    }
  }
  return $result;
}

my $key_hierarchy_a = ['SEX', 'NATIONALITY'];
print Dumper(aoh_to_hoh($aoa, $key_hierarchy_a));

根據@ FM的評論,你真的想要一個額外的數組級別。

輸出:

$VAR1 = {
          'F' => {
                   'Swedish' => [
                                  {
                                    'ID' => 543210,
                                    'NAME' => 'Susan',
                                    'AGE' => 36
                                  }
                                ]
                 },
          'M' => {
                   'British' => [
                                  {
                                    'ID' => 987654,
                                    'NAME' => 'Bart',
                                    'AGE' => 120
                                  }
                                ],
                   'Swedish' => [
                                  {
                                    'ID' => 123456,
                                    'NAME' => 'Dave',
                                    'AGE' => 12
                                  }
                                ]
                 }
        };

編輯:哦,BTW - 如果有人知道如何優雅地克隆參考的內容,請教。 謝謝!

編輯編輯:@FM幫助。 現在好多了:D

正如您所經歷的那樣,編寫代碼以創建任意深度的哈希結構有點棘手。 訪問這些結構的代碼同樣棘手。 這讓人不禁: 你真的想這么做嗎?

一種更簡單的方法可能是將原始信息放入數據庫中。 只要您關心的密鑰被編入索引,數據庫引擎就能夠非常快速地檢索感興趣的行: 給我所有SEX =女性和國籍=瑞典語的人 現在聽起來很有希望!

您可能還會發現這個松散相關的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM