use warnings; use strict; use Data::Dumper; my %rankBased = ( 190 => { test1 => { score => '13.28' }, test2 => { score => '-47.56' }, test3 => { score => '18.50' }, test4 => { score => '14.88' }, }, 191 => { test1 => { score => '9.18' }, test2 => { score => '2.84' }, test3 => { score => '15.62' }, test4 => { score => '11.84' }, }, ); for my $key1 (keys %rankBased) { my @sort_by_rank = sort { $rankBased{$key1}{$b}{score} <=> $rankBased{$key1}{$a}{score} } keys %{$rankBased{$key1}}; print Dumper(\@sort_by_rank); } __END__ $VAR1 = [ 'test3', 'test4', 'test1', 'test2' ]; $VAR1 = [ 'test3', 'test4', 'test1', 'test2' ];