Если не требуется абсолютная настройка скорости, я бы сделал объект с помощью Moose. Для чистой скорости используйте постоянные индексы и массив.
Мне нравятся объекты, потому что они уменьшают умственные усилия, необходимые для работы с большими глубокими структурами. Например, если вы строите структуру данных для представления различных классных комнат в школе. У вас будет что-то вроде списка детей, учителя и номера комнаты. Если у вас все в большой структуре, вы должны знать, как внутренние структуры имеют доступ к увлечениям детей в классе. С объектами вы можете сделать что-то вроде:
my @all_hobbies = uniq map $_->all_hobbies,
map $_->all_students, $school->all_classrooms;
Мне нет дела до внутренних органов. И я могу кратко составить уникальный список всех увлечений детей. Все сложные обращения все еще происходят, но мне не нужно беспокоиться о том, что происходит. Я могу просто использовать интерфейс.
Вот версия Moose вашего дочернего класса. Я настроил атрибут hobbies для использования свойства массива, поэтому мы получаем несколько методов просто для запроса.
package Child;
use Moose;
has [ 'name', 'hair_color', 'fav_color' ] => (
is => 'ro',
isa => 'Str',
required => 1,
);
has [ 'age', 'height', 'weight' ] => (
is => 'ro',
isa => 'Num',
required => 1,
);
has hobbies => (
is => 'ro',
isa => 'Int',
default => sub {[]},
traits => ['Array'],
handles => {
has_no_hobbies => 'is_empty',
num_hobbies => 'count',
has_hobbies => 'count',
add_hobby => 'push',
clear_hobbies => 'clear',
all_hobbies => 'elements',
},
);
# Good to do these, see moose best practices manual.
__PACKAGE__->meta->make_immutable;
no Moose;
Теперь для использования класса Child:
use List::MoreUtils qw( zip );
# Bit of messing about to make array based child data into objects;
@attributes = qw( name age height weight hair_color fav_color hobbies );
my @children = map Child->new( %$_ ),
map { zip @attributes, @$_ },
["James", 12, 1.62, 73, "dark brown", "blue", ["playing football", "eating ice-cream"]],
["Norah", 13, 1.75, 81, "black", "red", ["computer programming"]],
["Billy", 11, 1.31, 63, "red", "green", ["reading", "drawing"]],
;
# Now index by name:
my %children_by_name = map { $_->name, $_ } @children;
# Here we get kids with hobbies and print them.
for my $c ( grep $_->has_hobbies, @children ) {
my $n = $c->name;
my $h = join ", ", $c->all_hobbies;
print "$n likes $h\n";
}