in reply to Re: sorting an array of hashes by the value of the keys
in thread sorting an array of hashes by the value of the keys
I'll just expand on this so that it sorts on the key that starts with "doc" and ends with a number. This removes the "there must be only one key" requirement.
my @sorted_aoh = sort { (map /^doc(\d+)/ ? 0+$1 : (), keys(%$a))[0] <=> (map /^doc(\d+)/ ? 0+$1 : (), keys(%$b))[0] } @aoh;
That happens to be suboptimal because every comparison is doing a potentially expensive operation to each hash. An improvement would be to use a Guttman-Rossler transform and then you get something really slick.
my @sorted_aoh = map $aoh[ substr $_, 5 ], sort map { # Retrieve the document number my $doc_key = (map /^doc(\d+)$/ ? 0 + $1 : (), keys %{$aoh[$_]})[0 +]; # Return the document number, a null and the original array index pack( 'N', $doc_key ) . "\0" . $_; } 0 .. $#aoh
|
|---|