tied to potężny mechanizm Perl, który pozwala na zastąpienie standardowego zachowania zmiennej niestandardową logiką (poprzez obiekt implementujący specjalny interfejs). Zwykle jest używane do łączenia zmiennych z zewnętrznym magazynem lub niestandardowym zachowaniem (np. cache, baza danych, szyfrowanie w locie).
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; # Użycie: tie my %hash, 'FileHash', '/tmp/data.store'; $hash{x} = 42; print $hash{x};
TIEHASH, FETCH, STORE, EXISTS, DELETE, CLEAR.TIESCALAR), tablic (TIEARRAY) i haseł (TIEHASH).Pytanie: Czy można użyć funkcji untie do przywrócenia zmiennej do normalnego zachowania, i co się stanie, jeśli tego nie zrobimy?
Odpowiedź: Po użyciu untie %hash; dalsze operacje na zmiennej tracą połączenie z obiektem, ale wewnętrzne metody rozwiązywacze (DESTROY) mogą być wywoływane tylko po całkowitym zniszczeniu zmiennej. Jeśli nie wywołasz untie, przy zakończeniu skryptu dane mogą nie zostać zapisane lub może wystąpić wyciek pamięci.
tie my %h, 'SomeClass'; # ... pracujemy ... untie %h; # To poprawnie kończy działanie obiektu
Historia W systemie informacyjnym zrealizowano cache za pomocą
tiedla hasha, ale zapomniano poprawnie wywołać metody czyszczenia (untie). W rezultacie, przy kolejnych restartach usługi, cache ciągle rósł i nie zwalniał pamięci.
Historia W dzienniku audytu użyto
TIEARRAYdo przechowywania zdarzeń, a wewnątrz dziedziczono tylko część metod. W efekcie, przy próbie usunięcia elementu występowały trudne do uchwycenia błędy z powodu niezaimplementowanych metod.
Historia Podczas realizacji przejrzystego szyfrowania zawartości przez
tieskalar, zapomniano uwzględnić, że wiele modułów CPAN bezpośrednio używa wewnętrznych metod Perla, omijając interfejs tie. W efekcie dane okresowo zapisywane były w nieszyfrowanej postaci.