$free_space = { "node1" => { "cores" => 12, "mem" => 200 }, "node2" => { "cores" => 12, "mem" => 500 }, ... } #### cores memory node ----- ------ ---- 12 400 node456 12 400 node534 12 350 node23 11 500 node12 11 200 node3 10 900 node10 #### my %CoreMemNodes = (); #HoA -> -> (node1,node2,..) foreach my $node (keys %free_space) { push @{ $CoreMemNodes{$free_space{$node}{'cores'}}{$free_space{$node}{'mem'}} }, $node; } foreach my $free_cores (sort { $b <=> $a } keys %CoreMemNodes) { foreach my $free_mem (sort { $b <=> $a } keys %{ $CoreMemNodes{$free_cores} }) { foreach my $node (sort @{ $CoreMemNodes{$free_cores}{$free_mem} }) { print "SORTED:$free_cores $free_mem $node\n"; } } }