У меня есть массив хэшей, все с одним и тем же набором ключей, например ::100100
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])
так что, возможно, я смогу написать цикл, который будет добавлять по одному уровню за раз, удалять этот ключ из хеша, а затем добавлять оставшийся хеш к «текущему» местоположению, но это немного громоздко, а также я не уверен как сохранить 'местоположение' в хэше хешей ...