use Tie::Hash::Sorted;
my %hash = (
5189 => 63,
3213 => 9,
2357 => 3,
);
tie my %sorted_hash, 'Tie::Hash::Sorted',
Hash => \%ages,
Sort_Routine => sub { $a <=> $b },
);
sub next_key {
my ($h,$key) = @_;
foreach my $hkey (keys %$h) {
return $h->{$hkey} if $hkey >= $key;
}
return;
}
print next_key(\%hash,3000) . "\n";
You should be able to make a tied array.
A rough outline:
- Store your data in a hash, with keys as above.
- Keep an array of sorted keys.
- Your FETCH method will do lookups using a method like the above or even a binary search of your array of keys.
- Your STORE method will add an item to the hash, and resort the array.
- POP and SHIFT should remove and return the highest/lowest elements in the array.
- Not sure about UNSHIFT or PUSH. Should clearly define all the normal hash behavior.
Anyhow, this seems like a job for a tied array to me. Yeah you've got to do a lot of crud in the background to make it work, but once you are done, it becomes so easy to use.
tie my @numbers, 'Tie::Array::NextIndex',
Members => {
5189 => 63,
2357 => 3,
};
my $value = $numbers[3000]; # value = 63
$numbers[3213] = 9;
$value = $numbers[3000]; # value = 9
|