in reply to
HoH problem
In the spirit of TMTOWTDI here's an alternative solution that uses Sort::Key to improve readability.
To further improve the readability (without too much memory being wasted) this version also creates a partially flattened collection of [filename, letter, dataref] chunks.
<p.
It could be simplified further, but I kept the letter key capturing enabled in case it was neccesary for solving the problem with actual data (versus the example data).
#!/usr/bin/perl
use strict;
use warnings;
use Sort::Key qw(ikeysort);
my %hoh;
$hoh{'FILENAME1'}{'A'}{'weight'}=3000;
$hoh{'FILENAME1'}{'A'}{'intensity'}=2;
$hoh{'FILENAME1'}{'B'}{'weight'}=4000;
$hoh{'FILENAME1'}{'B'}{'intensity'}=3;
$hoh{'FILENAME2'}{'D'}{'weight'}=2000;
$hoh{'FILENAME2'}{'D'}{'intensity'}=7;
$hoh{'FILENAME2'}{'C'}{'weight'}=5000;
$hoh{'FILENAME2'}{'C'}{'intensity'}=3;
$hoh{'FILENAME3'}{'C'}{'weight'}=1000;
$hoh{'FILENAME3'}{'C'}{'intensity'}=4;
$hoh{'FILENAME3'}{'A'}{'weight'}=6000;
$hoh{'FILENAME3'}{'A'}{'intensity'}=3;
# Create a list of sets
# $set[0] = filename
# $set[1] = letter
# $set[2] = reference to the data for this filename-letter combination
my @sets;
for my $filename (keys %hoh) {
push @sets, [$filename, $_,$hoh{$filename}{$_}] for keys %{$hoh{$f
+ilename}}
}
for my $set (ikeysort { $_->[2]{weight} } @sets) {
my ($filename,$letter,$data) = @$set;
my $weight = $data->{weight};
my $intensity = $data->{intensity};
printf "weight: %4d intensity: %d Filename: %s\n",$weight,$intensi
+ty,$filename;
}