use strict; use warnings; use Data::Dumper; my $channel_name; my %files_by_channel = ( 'ch1' => { '00014' => '/foo/oradata/bar/foodb-lob01.dbf', '00008' => '/foo/oradata/bar/foodb-index11.dbf', }, 'ch2' => { '00004' => '/foo/oradata/bar/tools01.dbf', '00019' => '/foo/oradata/bar/foodb-data02.dbf', '00003' => '/foo/oradata/bar/undotbs01.dbf' }, ); my %rearranged; foreach my $ch ( keys %files_by_channel ) { my $file_ref = $files_by_channel{$ch}; foreach my $file ( keys %{$file_ref} ) { $rearranged{$file} = [ $ch, $file_ref->{$file} ] } } printf "%-10s %-15s %-40s\n", 'File#', 'Channel Name', 'File Name'; printf "%-10s %-15s %-40s\n", '-' x 10, '-' x 15, '-' x 40; printf "%-10s %-15s %-40s\n", $_, @{ $rearranged{$_} } for sort keys %rearranged;