use strict; use warnings; my %hoh = ( FILENAME1 => { A => {weight => 3000, intensity => 2}, B => {weight => 4000, intensity => 3}, }, FILENAME2 => { D => {weight => 2000, intensity => 7}, C => {weight => 5000, intensity => 3}, }, FILENAME3 => { C => {weight => 1000, intensity => 4}, A => {weight => 6000, intensity => 3}, }, ); my @lines = map {$_->[1]} sort {$a->[0] <=> $b->[0]} map { my $fn = $_; map { my $h = $hoh{$fn}{$_}; [$h->{weight}, "$fn $_ $h->{intensity}: $h->{weight}"] } keys %{$hoh{$fn}} } keys %hoh; print join "\n", @lines;