'tied' es un potente mecanismo de Perl que permite reemplazar el comportamiento estándar de una variable con lógica personalizada (a través de un objeto que implementa una interfaz especial). Se utiliza normalmente para vincular variables a un almacén externo o comportamiento no estándar (por ejemplo, caché, base de datos, cifrado en tiempo real).
package FileHash; use Storable; sub TIEHASH { my ($class, $file) = @_; my $data = -e $file ? retrieve($file) : {}; bless { file => $file, data => $data }, $class; } sub STORE { my ($s, $k, $v) = @_; $s->{data}{$k} = $v; store($s->{data}, $s->{file}); } sub FETCH { my ($s, $k) = @_; $s->{data}{$k} } sub EXISTS { my ($s, $k) = @_; exists $s->{data}{$k} } sub DELETE { my ($s, $k) = @_; delete $s->{data}{$k}; store($s->{data}, $s->{file}); } sub CLEAR { my $s = shift; $s->{data} = {}; store($s->{data}, $s->{file}); } 1; # Uso: tie my %hash, 'FileHash', '/tmp/data.store'; $hash{x} = 42; print $hash{x};
TIEHASH, FETCH, STORE, EXISTS, DELETE, CLEAR.TIESCALAR), arrays (TIEARRAY) y hashes (TIEHASH).Pregunta: ¿Se puede usar la función untie para devolver una variable a su comportamiento normal, y qué sucede si no se hace?
Respuesta: Después de usar untie %hash; las operaciones posteriores con la variable pierden conexión con el objeto, pero los métodos internos de desbloqueo (DESTROY) pueden ser llamados solo después de la destrucción completa de la variable. Si no se llama a untie, al finalizar el script, es posible que no se guarden datos o que ocurran fugas de memoria.
tie my %h, 'SomeClass'; # ... trabajamos ... untie %h; # Esto finaliza correctamente el funcionamiento del objeto
Historia En un sistema de información se implementó un caché a través de
tiepara un hash, pero se olvidaron de invocar correctamente los métodos de limpieza (untie). Como resultado, en reinicios repetidos del servicio, la caché crecía constantemente y no liberaba memoria.
Historia En el registro de auditoría se utilizó
TIEARRAYpara almacenar eventos, pero solo heredaron parcialmente algunos métodos. Como resultado, al intentar eliminar un elemento, surgieron errores difíciles de detectar debido a métodos no inicializados.
Historia Al implementar el cifrado transparente del contenido a través de
tie, se olvidaron de considerar que muchos módulos de CPAN utilizan directamente métodos internos de Perl, saltando la interfaz tie. Debido a esto, los datos se guardaban periódicamente sin cifrar.