package Number; use strict; use warnings; use IO::File; use Carp; use Fcntl ':flock'; use Tie::Scalar; our @ISA = qw(Tie::StdScalar); # VARs intern my $fh = new IO::File; my %rep = (); # Repository my $repkey = undef; # Pepository Key # Constructor sub TIESCALAR{ my $class = shift; my %args = ( -file => undef, -key => undef, -auto => 1, @_ ); croak "No file, use -file in args!" if not defined $args{-file}; croak "No key, use -key in args!" if not defined $args{-key}; deserialize($args{-file}) or return; $repkey = $args{-key} || '_default'; $rep{$repkey} ||= 0; $rep{$repkey}++ if $args{-auto} == 1; my $nr = $rep{$repkey}; return bless \$nr, $class; } # hash to file sub serialize{ if(defined $fh){ truncate $fh, 0; seek $fh, 0, 0; while(my ($k, $v) = each %rep){ print $fh pack("N", length $k).$k.pack("N", $v); } } } # hash from $file sub deserialize{ my $file = shift; $fh->open($file, O_CREAT|O_BINARY|O_RDWR) or return; flock($fh, LOCK_EX) or die "Your system does not support flock()!"; binmode $fh, ':raw'; seek $fh, 0, 0; my ($buffer, $key, $klen, $number) = (undef, undef, undef, undef); while(read $fh, $buffer, 4){ $klen = unpack "N", $buffer; read $fh, $key, $klen; read $fh, $buffer, 4; $rep{$key} = unpack "N", $buffer; } return 1; } sub DESTROY{ serialize(); undef $fh; } ########################################################################### 1; ######################################################################## ###########################################################################