tied è un meccanismo potente di Perl che consente di sostituire il comportamento standard di una variabile con una logica personalizzata (attraverso un oggetto che implementa un'interfaccia speciale). Di solito viene utilizzato per collegare variabili a memorie esterne o comportamenti non standard (ad esempio, cache, database, crittografia in tempo reale).
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; # Utilizzo: tie my %hash, 'FileHash', '/tmp/data.store'; $hash{x} = 42; print $hash{x};
TIEHASH, FETCH, STORE, EXISTS, DELETE, CLEAR.TIESCALAR), array (TIEARRAY) e hash (TIEHASH).Domanda: È possibile utilizzare la funzione untie per ripristinare il comportamento normale della variabile, e cosa succede se non lo si fa?
Risposta: Dopo aver utilizzato untie %hash;, ulteriori operazioni sulla variabile perdono il legame con l'oggetto, ma i metodi interni di distruzione (DESTROY) possono essere chiamati solo dopo la completa distruzione della variabile. Se non si chiama untie, alla fine dello script potrebbero non essere salvati dati o potrebbero verificarsi perdite di memoria.
tie my %h, 'SomeClass'; # ... lavoriamo ... untie %h; # Questo termina correttamente il lavoro dell'oggetto
Storia In un sistema informativo è stata implementata una cache attraverso
tieper un hash, ma si è dimenticato di chiamare correttamente i metodi di pulizia (untie). Di conseguenza, durante i riavvii ripetuti del servizio, la cache continuava a crescere e non liberava memoria.
Storia Nel registro di audit è stato utilizzato
TIEARRAYper memorizzare gli eventi, e all'interno sono stati ereditati solo alcuni metodi. Di conseguenza, nel tentativo di eliminare un elemento, si sono verificate errori difficili da rilevare a causa di metodi non inizializzati.
Storia Nell'implementazione della crittografia trasparente del contenuto tramite
tiescalar, si è dimenticato di considerare che molti moduli CPAN utilizzano direttamente i metodi interni di Perl, bypassando l'interfaccia tie. A causa di ciò, i dati venivano occasionalmente salvati in forma non crittografata.