#!/usr/bin/perl use strict; use warnings; 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; # Let's flatten %hoh out, and store what we care about in this # array of references to arrays. my @by_weights = (); # Populate @by_weights. for my $key_in_hoh (keys %hoh) { for my $key_in_fin (keys %{$hoh{$key_in_hoh}}) { for my $key_in_let (keys %{$hoh{$key_in_hoh}{$key_in_fin}}) { # We'll fix the intensity value later. if ($key_in_let eq 'weight') { push @by_weights, [ $key_in_let, $hoh{$key_in_hoh}{$key_in_fin}{$key_in_let}, 'intensity', 0, # Fill in correct value later. $key_in_fin, $key_in_hoh, ]; } } } } # Correct the intensity values. for (@by_weights) { my ( $key_in_hoh, $key_in_fin ) = ( $_->[5], $_->[4] ); $_->[3] = $hoh{$key_in_hoh}{$key_in_fin}{intensity}; } # Now, sort by weight. @by_weights = sort { $a->[1] <=> $b->[1] } @by_weights; for (@by_weights) { print "${$_}[0]: ${$_}[1] $_->[2]: ${$_}[3] filename: $_->[5]\n"; }