Nothing is jumping out at me from CPAN, except maybe Tie::RangeHash, which you might find a way to use with what you're doing. If not, here's a solution (not particularly efficient though):
sub get_fuzzy { my ($k, $h) = @_; return $h->{$k} if exists $h->{$k}; for (sort keys %$h) { return $h->{$_} if $_ gt $k; # if keys are numeric, change "g +t" to ">" } return undef; # if key is higher than the highest } my %hash = (a=>1, c=>3, e=>5, g=>7, i=>9); print "|", join('|', map { get_fuzzy($_, \%h) } a..j), "|\n";
It's inefficient because it sorts all the hash keys each time there is a lookup and does a linear search through them. Also, I'm not sure what you want to do when looking up a value larger than the largest hash key. In this case, my code returns undef.
If you want efficiency, you may want to tie a class of your own that maintains the keys in sorted order, perhaps even indexed so you could do a binary search instead of a linear one.
-- Mike
--
XML::Simpler does not require XML::Parser or a SAX parser.
It does require File::Slurp.
-- grantm, perldoc XML::Simpler
In reply to Re: retrieve next avaiable element in sorted hash
by thelenm
in thread retrieve next avaiable element in sorted hash
by vinforget
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |