package RangedHash; sub TIEHASH { bless({}, shift); } # the key should be the start point of the range sub STORE { $_[0]->{$_[1]} = $_[2]; } sub FETCH { my ($self, $point) = @_; my $cursor = 0; foreach ( sort keys %$self ) { return $self->{$cursor} if ( $point >= $cursor && $point < $_ ); $cursor = $_; } return $self->{$cursor} } package main; my %ranged_hash; tie(%ranged_hash, "RangedHash"); $ranged_hash{0} = 'foo'; $ranged_hash{10} = 'bar'; $ranged_hash{20} = 'qux'; $range_hash{3}; # 'foo' $range_hash{14}; # 'bar' $range_hash{27}; # 'qux'