tied ist ein leistungsfähiger Mechanismus in Perl, der es ermöglicht, das Standardverhalten einer Variablen durch benutzerdefinierte Logik (über ein Objekt, das eine spezielle Schnittstelle implementiert) zu ersetzen. Es wird normalerweise verwendet, um Variablen mit externen Speichern oder nicht standardisiertem Verhalten zu koppeln (z. B. Cache, Datenbank, On-the-fly-Verschlüsselung).
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; # Verwendung: tie my %hash, 'FileHash', '/tmp/data.store'; $hash{x} = 42; print $hash{x};
TIEHASH, FETCH, STORE, EXISTS, DELETE, CLEAR implementieren.TIESCALAR), Arrays (TIEARRAY) und Hashes (TIEHASH).Frage: Kann die Funktion untie verwendet werden, um eine Variable zum normalen Verhalten zurückzuführen, und was passiert, wenn dies nicht getan wird?
Antwort: Nach der Verwendung von untie %hash; verlieren weitere Operationen mit der Variablen den Bezug zum Objekt, aber interne Aufräum-Methoden (DESTROY) können nur nach der vollständigen Zerstörung der Variablen aufgerufen werden. Wenn untie nicht aufgerufen wird, können beim Beenden des Skripts Daten nicht gespeichert oder Speicherlecks auftreten.
tie my %h, 'SomeClass'; # ... arbeiten ... untie %h; # Dies beendet korrekt die Objektarbeit
Geschichte In einem Informationssystem wurde ein Cache über
tiefür einen Hash implementiert, aber es wurde vergessen, die Aufräummethoden korrekt aufzurufen (untie). Infolgedessen wuchs der Cache bei wiederholten Neustarts des Dienstes ständig und gab keinen Speicher frei.
Geschichte Im Prüfprotokoll wurde
TIEARRAYzur Speicherung von Ereignissen verwendet, wobei innen nur ein Teil der Methoden vererbt wurde. Infolgedessen traten beim Versuch, ein Element zu löschen, schwer auffindbare Fehler aufgrund nicht initialisierter Methoden auf.
Geschichte Bei der Implementierung einer transparenten Verschlüsselung des Inhalts über
tieeines Skalars wurde vergessen zu berücksichtigen, dass viele CPAN-Module direkt auf die internen Methoden von Perl zugreifen und die tie-Schnittstelle umgehen. Infolgedessen wurden die Daten gelegentlich unverschlüsselt gespeichert.