'tied' — Perl'in güçlü bir mekanizmasıdır ve değişkenin standart davranışını özel bir arayüzü uygulayan bir nesne aracılığıyla özelleştirmenizi sağlar. Genellikle değişkenleri üçüncü taraf depolama ile bağlamak veya standart olmayan davranışlar (örneğin, önbellek, veritabanı, anlık şifreleme) için kullanılır.
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; # Kullanım: tie my %hash, 'FileHash', '/tmp/data.store'; $hash{x} = 42; print $hash{x};
TIEHASH, FETCH, STORE, EXISTS, DELETE, CLEAR yöntemlerini uygulamalıdır.TIESCALAR), diziler (TIEARRAY) ve hashler (TIEHASH) için çalışır.Soru: untie fonksiyonu kullanılabilir mi ve bu işlemi yapmazsanız ne olacak?
Cevap: untie %hash; kullandıktan sonra değişkendeki işlemler nesne ile bağlantıyı kaybeder, ancak dahili çözme yöntemleri (DESTROY) yalnızca değişken tamamen yok olduğunda çağrılabilir. untie çağrılmazsa, skript sona erdiğinde veriler kaydedilmeyebilir veya bellek sızıntıları oluşabilir.
tie my %h, 'SomeClass'; # ... çalışıyoruz ... untie %h; # Bu, nesnenin düzgün bir şekilde sonlanmasını sağlar
Hikaye Bilgi sisteminde bir önbellek
tiearacılığıyla hash kullanılarak uygulanmış, ancak temizleme yöntemi (untie) düzgün çağrılmamıştır. Sonuç olarak, hizmetin tekrar tekrar başlatılmasında önbellek sürekli büyümüş ve bellek serbest bırakılmamıştır.
Hikaye Denetim kaydında, olayları saklamak için
TIEARRAYkullanılmış ve iç kısımlar sadece bazı yöntemleri miras almıştır. Sonuç olarak, bir öğeyi silme girişiminde, başlatılmamış yöntemlerden dolayı zor tespit edilen hatalar meydana gelmiştir.
Hikaye
tieile içeriğin şifrelenmesini sağlarken, birçok CPAN modülünün Perl’in iç yöntemlerini doğrudan kullanmasını göz ardı ettik. Bu yüzden, veriler dönem dönem şifrelenmemiş olarak kaydedilmiştir.