my @bucket = (); while($#Notes >= 0) { my $n = shift @Notes; push @{$bucket[$n->{terms}-1]},$n; } #Need 1D array back: while($#bucket >= 0) { my $b = pop @bucket; push @Notes, shift @$b while ($#{$b} >= 0); }