use strict; use warnings; use Data::Dumper; my %data = ( 'car' => 10, 'motorcycle' => 7, 'skate' => 7, 'board' => 2, 'roller' => 4, 'vase' => 4, 'bird' => 4, ); my ($n, @rank) = 1; foreach( keys %data){ $rank[ $data{$_} ] .= "$_\n" ; } print Dumper(\@rank); defined and $n += print s/^/$n - /gmr for reverse @rank; __DATA__ $VAR1 = [ undef, undef, 'board ', undef, 'vase bird roller ', undef, undef, 'motorcycle skate ', undef, undef, 'car ' ]; 1 - car 2 - motorcycle 2 - skate 3 - vase 3 - bird 3 - roller 4 - board