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.
In reply to Re: HoH problem
by BrowserUk
in thread HoH problem
by tamaguchi
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |