Если вы не знаете, какие ключи может иметь хэш, воспользуйтесь одним из предложенных связанных хэшей или просто включите предупреждения.Имейте в виду, что связывание очень медленно , в девять раз медленнее, чем обычный хэш, и в три раза медленнее, чем объект.
Если у вас есть фиксированный набор возможных ключей, что вы хотите, это ограниченный хеш .Ограниченный хеш позволит вам получить доступ к заданному набору ключей и выдаст ошибку, если вы попытаетесь получить доступ к чему-либо еще.Это также может рекурсивно.Это гораздо быстрее, чем связывание.
В противном случае я бы предложил превратить ваши данные в объект с помощью методов, а не прямого доступа к хешу.Это медленнее, чем хеш или ограниченный хеш, но быстрее, чем связанный хеш.В CPAN существует множество модулей для генерации методов, начиная с Class :: Accessor .
Если ваши данные не фиксированы, вы можете написать простые методы get () и set (), такие какИтак:
package Safe::Hash;
use strict;
use warnings;
use Carp;
sub new {
my $class = shift;
my $self = shift || {};
return bless $self, $class;
}
sub get {
my($self, $key) = @_;
croak "$key has no value" unless exists $self->{$key};
return $self->{$key};
}
sub set {
my($self, $key, $value) = @_;
$self->{$key} = $value;
return;
}
Вы можете получить рекурсивное поведение, храня объекты в объектах.
my $inner = Safe::Hash->new({ foo => 42 });
my $outer = Safe::Hash->new({ bar => 23 });
$outer->set( inner => $inner );
print $outer->get("inner")->get("foo");
Наконец, поскольку вы упомянули ревизии БД, если ваши данные читаются из базы данных, то вызахочет взглянуть на сопоставитель объектных отношений (ORM), чтобы сгенерировать классы и объекты и операторы SQL для вас. DBIx :: Class и Rose :: DB :: Object - два хороших примера.