use warnings; use strict; my @nlist = (0,0,1,2,3,3,4,5,6,8,8,10); my @key_list = ('A'..'Z'); my $tolerance = 1; my %hoa; my %uniq; @uniq{@nlist[1..$#nlist]} = (); for my $centroid (sort {$a <=> $b} keys %uniq) { my $key = shift @key_list; $hoa{$key} = [grep in_range($centroid, $_), @nlist ]; } print "$_ => [@{$hoa{$_}}]\n" for sort keys %hoa; sub in_range { my ($centroid, $testnum) = @_; return abs($centroid - $testnum) <= $tolerance; }