in reply to HoH problem

I don't think this can be classed as 'elegant' :)

printf "weight:%d intensity: %d filename: %s\n", $hoh{ $_->[ 0 ] }{ $_->[ 1 ]}{ weight }, $hoh{ $_->[ 0 ] }{ $_->[ 1 ]}{ intensity }, $_->[ 0 ] for sort{ $hoh{ $a->[0] }{ $a->[1] }{weight} <=> $hoh{ $b->[0] }{ $b->[1] }{weight} } map{ my $hash = $_; map{ [ $hash, $_ ] } keys %{ $hoh{ $_ } } } keys %hoh;; weight:1000 intensity: 4 filename: FILENAME3 weight:2000 intensity: 7 filename: FILENAME2 weight:3000 intensity: 2 filename: FILENAME1 weight:4000 intensity: 3 filename: FILENAME1 weight:5000 intensity: 3 filename: FILENAME2 weight:6000 intensity: 3 filename: FILENAME3

Update: The above simplifies somewhat by using a half-ST, and in the process becomes a bit more efficient which never hurts:

printf "weight:%d intensity: %d filename: %s\n", @{ $_ }[ 0, 1, 2 ] for sort{ $a->[ 0 ] <=> $b->[ 0 ] } map{ my $key = $_; map{ [ $hoh{ $key }{ $_ }{ weight }, $hoh{ $key }{ $_ }{ intensity }, $key, $_ ] } keys %{ $hoh{ $key } } } keys %hoh;;

Update2: And that can be further simplified using values instead of keys which allows the removal of several dereferences and a piece of redundant information from the final arrays:

printf "weight:%d intensity: %d filename: %s\n", @$_ for sort{ $a->[ 0 ] <=> $b->[ 0 ] } map{ my $key = $_; map{ [ $_->{ weight }, $_->{ intensity }, $key ] } values %{ $hoh{ $key } } } keys %hoh;;

If you didn't need the filename in the output, you could use values in the outer map and simplify things further.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.