That's why it's called the quick fix :-)
How about...
package FileHash;
use strict;
use warnings;
use Tie::Hash;
use Data::Dumper;
our @ISA = ("Tie::Hash");
sub TIEHASH {
my ($class, $file) = @_;
my $s = bless {
FILE => $file,
DATA => {},
},$class;
$s->_read();
return $s;
}
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 { $_[0]->_write }
# ----- private subs -----
sub _write { # still need to deal with race conditions
my $file = $_[0]->{FILE} ;
open (FH, "> $file") or die "Can't open $file for FileHash _write:
+$!";
print FH Dumper($_[0]->{DATA}); # writes out as $VAR1 = { ..... }
close FH or die "Can't close $file for FileHash _write: $!";
}
sub _read { # still need to deal with race conditions
my $self = shift;
return unless -f $self->{FILE};
$self->{DATA} = do $self->{FILE};
}
1;