### BEGIN OF tie_rounded_hash MODULE require 5.005; use strict; #use warnings; #use diagnostics -verbose; package tie_rounded_hash; BEGIN { use Carp; use Exporter (); our (@ISA, @EXPORT_OK, @EXPORT); our $VERSION = '1.0'; @ISA = qw(Exporter); @EXPORT = qw(); @EXPORT_OK = qw(); } our %Rounded = (); our %List = (); our @EXPORT_OK; #sub TIEHASH { bless \%List, $_[0] } #sub FETCH { $_[0]->{$_[1]} } sub STORE { $List{$_[1]} = $_[2] } sub FIRSTKEY { my $a = scalar keys %List; each %List } sub NEXTKEY { each %List } sub EXISTS { exists $List{$_[1]} } sub DELETE { delete $List{$_[1]} } sub CLEAR { %List = () } sub TIEHASH { my $self = shift; my $rounded = shift || 0; # rounded is the number of digits to leave to the right of the decimal point. croak "usage: $self <#of_digits>" if @_; bless {Rounded => $rounded, LIST => \%List}, $self; } sub FETCH { my $self = shift; my $key = shift; if ($self->{Rounded}) { return sprintf("%1.*f",$self->{Rounded},$List{$key}); } else { return $List{$key}; } } 1; ### END of module ### example script use strict; use lib qw(.); use tie_rounded_hash; my %test; my %rounded; tie %test, 'tie_rounded_hash',0; tie %rounded,'tie_rounded_hash',2; for (1..100) { $test{$_} = $^T/$_; } for (1..100) { print "$_ => $test{$_}\t $rounded{$_}\n"; }