Второй комментарий Майкла Кармана: пожалуйста, не используйте термин «Hashmap» или «map», когда вы имеете в виду хэш или ассоциативный массив. Особенно, когда в Perl есть функция map; это просто смущает вещи.
Сказав это, ответ Кайла Бертона является в основном обоснованным: обычно достаточно либо хеша, либо массива, либо сложной структуры, состоящей из смеси обоих. Perl ухмыляется, но не применяет его; Скорее всего, плохо определенная структура данных может быть достаточно для того, что вам нужно.
В противном случае, пожалуйста, определите более точно, что вы подразумеваете под "вычислять свойство уровня коллекции для каждого элемента". И имейте в виду, что в Perl есть такие ключевые слова, как map и grep, которые позволяют вам выполнять функциональные задачи программирования, например,
my $record = get_complex_structure();
# $record = {
# 'widgets' => {
# name => 'ACME Widgets',
# skus => [ 'WIDG01', 'WIDG02', 'WIDG03' ],
# sales => {
# WIDG01 => { num => 25, value => 105.24 },
# WIDG02 => { num => 10, value => 80.02 },
# WIDG03 => { num => 8, value => 205.80 },
# },
# },
# ### and so on for 'grommets', 'nuts', 'bolts' etc.
# }
my @standouts =
map { $_->[0] }
sort {
$b->[2] <=> $a->[2]
|| $b->[1] <=> $a->[1]
|| $record->{$a->[0]}->{name} cmp $record->{$b->[0]}->{name}
}
map {
my ($num, $value);
for my $sku (@{$record->{$_}{skus}}) {
$num += $record->{$_}{sales}{$sku}{num};
$value += $record->{$_}{sales}{$sku}{value};
}
[ $_, $num, $value ];
}
keys %$record;
Считывание задом наперед, это конкретное преобразование Шварцциана делает три вещи:
3) Он берет ключ к $ record, просматривает SKU, определенные в этой произвольной структуре, и определяет общее количество и общую стоимость транзакций. Возвращает анонимный массив, содержащий ключ, количество транзакций и общее значение.
2) Следующий блок получает несколько массивов и сортирует их a) в первую очередь путем сравнения общего значения численно в порядке убывания; б) если значения равны, сравнивая количество транзакций, численно в порядке убывания; и c) если это не удастся, путем сортировки асибетически по имени, связанному с этим порядком.
1) Наконец, мы берем ключ к $ record из отсортированной структуры данных и возвращаем его.
Вполне может быть, что вам не нужно создавать отдельный класс, чтобы делать то, что вы хотите.