【发布时间】:2011-04-20 11:21:55
【问题描述】:
我有一个哈希数组,都具有相同的一组键,例如:
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])
所以也许我可以编写一个循环,一次添加一个级别,从哈希中删除该键,而不是将剩余的哈希添加到“当前”位置,但这有点麻烦而且我也不确定如何在哈希哈希中保留“位置”...
【问题讨论】:
-
您预期的数据结构看起来不对。例如,如果有两个瑞典女性,
$expected{FEMALE}{Swedish}应该包含什么?您展示它的方式(一直向下散列),这个问题没有一个好的答案。我的假设是$expected{FEMALE}{Swedish}需要是一个 array reference 包含修剪的哈希引用。 -
这其实并不那难做到,但你必须列出一个更明确的结构。也许在 XML 中描述层次结构,哪些是属性/一次出现的元素,哪些可以被多次列出。
-
关于 FM 所说的,您不需要 arrayref,但您需要某种独特的密钥系统。数组很好,因为它们天生就创建了唯一索引。
标签: perl hash perl-data-structures