Hash-Tying Methods
Here’s an example of an interesting tied-hash class: it gives you a hash representing a particular user’s dot files (that is, files whose names begin with a period, which is a naming convention for initialization files under Unix). You index into the hash with the name of the file (minus the period) and get back that dot file’s contents. For example:
use DotFiles;
tie %dot, "DotFiles";
if ( $dot{profile} =~ /MANPATH/ ||
$dot{login} =~ /MANPATH/ ||
$dot{cshrc} =~ /MANPATH/ ) {
print "you seem to set your MANPATH\n";
}Here’s another way to use our tied class:
# Third argument is the name of a user whose dot files we will tie to.
tie %him, "DotFiles", "daemon";
foreach $f (keys %him) {
printf "daemon dot file %s is size %d\n", $f, length $him{$f};
}In our DotFiles example we
implement the object as a regular hash containing several important
fields, of which only the {CONTENTS} field will contain what the
user thinks of as the hash. Table 14-1
gives the object’s actual fields.
Table 14-1. Object fields in DotFiles
| Field | Contents |
|---|---|
USER
| Whose dot files this object represents |
HOME
| Where those dot files live |
CLOBBER
| Whether we are allowed to change or remove those dot files |
CONTENTS
| The hash of dot file names and content mappings |
Here’s the start of DotFiles.pm:
package DotFiles;
use Carp;
sub whowasi { (caller(1))[3] . "()" }
my $DEBUG = 0;
sub debug { $DEBUG = @_ ? shift : 1 }For our example we want to be able to turn on debugging output to help in tracing during development, ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access