Это, вероятно, лучше всего сделать с привязанным хешем. Связанные переменные позволяют определить реализацию низкоуровневых операций с переменной. В этом случае нам нужен специальный метод выборки, который умирает при доступе к несуществующим ключам:
use warnings;
use strict;
{package Safe::Hash;
require Tie::Hash;
our @ISA = 'Tie::StdHash';
use Carp;
sub FETCH {
exists $_[0]{$_[1]} or croak "no key $_[1]";
$_[0]{$_[1]}
}
}
tie my %safe => 'Safe::Hash';
$safe{a} = 5; # ok
print $safe{a}, "\n"; # ok
$safe{b} = 10; # ok
print $safe{bb}, "\n"; # dies
В реализации Safe::Hash
выше, я сначала загружаю Tie::Hash
, который обеспечивает Tie::StdHash
. Установка @ISA
в Tie::StdHash
предоставляет нашему новому пакету методы связи, которые ведут себя так же, как обычные хеши. Каждый из методов связи описан на http://perldoc.perl.org/perltie.html
В этом случае единственный метод для переопределения - это FETCH
, которому передается ссылка на скрытый связанный объект (в данном случае хэш-ссылка) и ключ для использования. Он проверяет, существует ли слот, и либо возвращает его, либо выдает ошибку