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.
|
|---|