Dave05 has asked for the wisdom of the Perl Monks concerning the following question:
Peace be upon the Monksters;
I have a simple (or so I thought) class ('FileHash') that ties a hash to a file, reading data into the hash upon instantiation, and writing the hash out to the file when DESTROYed.
I want to use the class for several hashes e.g.
but the second call to tie clears out any data that may have been read into the first hash and replaces it with the data from the second hash.my (%pwds, %boxes); tie (%pwds, 'FileHash', "$dir/pwds"); tie (%boxes, 'FileHash', "$dir/boxes");
I just can't get my head around why this happens.
Here is the code for my class:
package FileHash; use strict; use warnings; use Tie::Hash; use Data::Dumper; our @ISA = ("Tie::Hash"); sub TIEHASH { my ($class, $file) = @_; my $s = {}; $s->{DATA} = _read($file) || {}; $s->{FILE} = $file; bless $s, $class; } sub STORE { $_[0]->{DATA}{$_[1]} = $_[2] } sub CLEAR { $_[0]->{DATA} = () } sub FETCH { $_[0]->{DATA}{$_[1]} } sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]->{DATA}} } sub NEXTKEY { each %{$_[0]->{DATA}} } sub EXISTS { exists $_[0]->{DATA}{$_[1]} } sub DELETE { delete $_[0]->{DATA}{$_[1]} } sub DESTROY { _write ($_[0]) } # ----- private subs ----- sub _write { # still need to deal with race conditions my %data = %{$_[0]->{DATA}}; my $file = $_[0]->{FILE} ; open (FH, "> $file") or die "Can't open $file for FileHash _write: +$!"; print FH Data::Dumper->Dump([\%data], ['*data']); close FH or die "Can't close $file for FileHash _write: $!"; } sub _read { # still need to deal with race conditions no strict; my $file = shift; return undef unless -f $file; unless (my $ret = do $file) { warn "couldn't parse $file: $@" if $@; warn "couldn't do $file: $!" unless defined $ret; } return \%data; } 1;
Back to
Seekers of Perl Wisdom