in reply to sort HoH by second level values in specific order
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:
This gives the following output:#!/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;
which I believe is what you want.12 400 node456 12 400 node534 12 350 node23 11 500 node12 11 200 node3 10 900 node10
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.
|
|---|