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 "gt" 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";