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;
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Tie-ing hashes clobbers data
by demerphq (Chancellor) on Apr 08, 2002 at 15:06 UTC | |
by Anonymous Monk on Apr 08, 2002 at 22:36 UTC | |
by demerphq (Chancellor) on Apr 09, 2002 at 08:04 UTC | |
by Anonymous Monk on Apr 09, 2002 at 13:38 UTC | |
| |
by demerphq (Chancellor) on Apr 09, 2002 at 17:01 UTC | |
| |
Referencing globals clobbers data
by Joost (Canon) on Apr 08, 2002 at 15:14 UTC | |
by demerphq (Chancellor) on Apr 08, 2002 at 15:23 UTC | |
by Joost (Canon) on Apr 08, 2002 at 15:54 UTC | |
by demerphq (Chancellor) on Apr 08, 2002 at 16:24 UTC | |
Re: Tie-ing hashes clobbers data
by dragonchild (Archbishop) on Apr 08, 2002 at 15:22 UTC | |
Re: Tie-ing hashes clobbers data
by Dave05 (Beadle) on Apr 08, 2002 at 15:41 UTC | |
by Dave05 (Beadle) on Apr 08, 2002 at 15:56 UTC | |
by demerphq (Chancellor) on Apr 08, 2002 at 16:40 UTC |
Back to
Seekers of Perl Wisdom