Hi
lener,
this is basically the same idea as poj (and reusing poj's input data), except that this does not bother to create an explicit temporary array:
#!/usr/bin/perl
use strict;
use warnings;
use feature "say";
my $free_space = {
node3 => { cores => 11, mem => 200 },
node10 => { cores => 10, mem => 900 },
node12 => { cores => 11, mem => 500 },
node23 => { cores => 12, mem => 350 },
node456 => { cores => 12, mem => 400 },
node534 => { cores => 12, mem => 400 },
};
say "@$_" for sort { $b->[0] <=> $a->[0] or $b->[1] <=> $a->[1] or $a-
+>[2] cmp $b->[2] }
map { [$free_space->{$_}{cores}, $free_space->{$_}{mem}, $_ ]}
+keys %$free_space;
This gives the following output:
12 400 node456
12 400 node534
12 350 node23
11 500 node12
11 200 node3
10 900 node10
which I believe is what you want.
This is the idea of a data pipeline. The code should be read from bottom to top (and right to left). The map in the second line creates an in-memory list of anonymous arrays, which is then sorted and displayed by the first line.