use strict; use warnings; use feature 'say'; my $free_space = { node1 => { cores => 12, mem => 200 }, node2 => { cores => 12, mem => 500 }, node3 => { cores => 10, mem => 600 }, node4 => { cores => 11, mem => 500 }, node5 => { cores => 16, mem => 800 }, node6 => { cores => 16, mem => 800 }, }; for ( sort my_sort keys %{ $free_space } ) { say "$free_space->{$_}->{'cores'} $free_space->{$_}->{'mem'} $_"; } sub my_sort { $free_space->{$b}->{'cores'} <=> $free_space->{$a}->{'cores'} || $free_space->{$b}->{'mem'} <=> $free_space->{$a}->{'mem'} || $a cmp $b } #### $ perl 1205589.pl 16 800 node5 16 800 node6 12 500 node2 12 200 node1 11 500 node4 10 600 node3