Este es probablemente el mejor hecho con un hash atado. Las variables vinculadas le permiten definir la implementación de las operaciones de bajo nivel de la variable. En este caso, queremos ir a buscar un método especial que muere cuando se accede a claves inexistentes:
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
en la implementación de Safe::Hash
anterior, primera carga Tie::Hash
que proporciona Tie::StdHash
. La configuración @ISA
a Tie::StdHash
proporciona nuestro nuevo paquete con métodos de vinculación que se comportan de la misma manera que los hashes normales. Cada uno de los métodos de vinculación se describe en http://perldoc.perl.org/perltie.html
En este caso, el único método para anular es FETCH
al que se le pasa una referencia al objeto vinculado oculto (un hashref en este caso) y la clave a usar. Comprueba si la ranura existe, y la devuelve o arroja un error
No es necesario verificar si una clave está 'definida', sino si' existe'. No hay claves hash indefinidas * per se *. – pilcrow
@pilcrow gracias por la corrección. –