tied is een krachtige mechanism in Perl die het mogelijk maakt om het standaard gedrag van een variabele te vervangen door aangepaste logica (via een object dat een speciale interface implementeert). Dit wordt meestal gebruikt voor het koppelen van variabelen aan externe opslag of niet-standaard gedrag (zoals caching, databases, on-the-fly encryptie).
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; # Gebruik: tie my %hash, 'FileHash', '/tmp/data.store'; $hash{x} = 42; print $hash{x};
TIEHASH, FETCH, STORE, EXISTS, DELETE, CLEAR implementeren.TIESCALAR), arrays (TIEARRAY) en hashes (TIEHASH).Vraag: Kan de functie untie worden gebruikt om een variabele terug te brengen naar het normale gedrag, en wat gebeurt er als dat niet gebeurt?
Antwoord: Na het gebruik van untie %hash; verliezen verdere bewerkingen met de variabele de verbinding met het object, maar interne destructiemethoden (DESTROY) kunnen pas worden aangeroepen na de volledige vernietiging van de variabele. Als untie niet wordt aangeroepen, kunnen gegevens verloren gaan of kunnen er geheugenlekken optreden bij het beëindigen van het script.
tie my %h, 'SomeClass'; # ... werken ... untie %h; # Dit beëindigt correct het object
Verhaal In een informatiesysteem werd caching via
tievoor een hash gerealiseerd, maar men vergat correct de schoonmaakmethoden (untie) aan te roepen. Als gevolg daarvan groeide de cache voortdurend en werd er geen geheugen vrijgegeven bij herhaalde herstarten van de service.
Verhaal In het auditlog gebruikten ze
TIEARRAYvoor het opslaan van gebeurtenissen, maar erfden alleen een deel van de methoden binnenin. Hierdoor traden moeilijk te traceren fouten op bij de poging om een element te verwijderen vanwege niet-geïnitieerde methoden.
Verhaal Bij de implementatie van transparante encryptie van inhoud via
tiescalars, vergaten ze rekening te houden met het feit dat veel CPAN-modules direct de interne methoden van Perl gebruiken, waarbij ze de tie-interface omzeilen. Daardoor werden gegevens periodiek opgeslagen in ongeëngcodeerde vorm.