See sort, which demonstrates how to create a custom sort routine:
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
}
Output:
$ perl 1205589.pl
16 800 node5
16 800 node6
12 500 node2
12 200 node1
11 500 node4
10 600 node3
Hope this helps!
The way forward always starts with a minimal test.