I have an array of hashes, all with the same set of keys, for example:
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'}, ]
I would like to write a routine that converts this to a hash of hashes using a given key hierarchy:
my $key_hierarchy_a = ['SEX', 'NATIONALITY']; aoh_to_hoh ($aoa, $key_hierarchy_a) = @_; ... }
will return
{M=> {Swedish=>{{NAME=>'Dave', AGE=>12, ID=>123456}}, British=>{{NAME=>'Bart', AGE=>120, ID=>987654}}}, F=> {Swedish=>{{NAME=>'Susan', AGE=>36, ID=>543210}} }
Please note that this not only creates the correct key hierarchy, but also removes the extra keys now.
I am stuck at the point where I need to create a new, innermost hash in the correct hierarchical arrangement.
The problem is that I do not know the "depth" (i.e. the number of keys). If I have a constant number, I could do something like:
%h{$inner_hash{$PRIMARY_KEY}}{$inner_hash{$SECONDARY_KEY}}{...} = filter_copy($inner_hash,[$PRIMARY_KEY,$SECONDARY_KEY])
so maybe I can write a loop that will add one level at a time, remove this key from the hash, than add the remaining hash to the "current" location, but it's a little cumbersome, and I'm not sure how to save the "location" in the hash hashes ...