my $Hash = { "A" => ["HYU"], "B" => ["TU6"], "C" => [ "11", "09", "88", "2" ], "D" => [ "01", "11" ] }; #### A, B, C, D HYU TU6 11 01 09 11 88 2 #### use warnings; use strict; my $Hash = { "A" => ["HYU"], "B" => ["TU6"], "C" => [ "11", "09", "88", "2" ], "D" => [ "01", "11" ] }; # get headiing print join( ",\t" => sort keys %$Hash ), $/; # get the value with the highest numbers of element my $highest_item = 0; foreach ( keys %{$Hash} ) { my $value = scalar @{ $Hash->{$_} }; $highest_item = $value if $highest_item < $value; } # re-write the data given as AoA, with data needed my @final_data; foreach my $key ( sort keys %{$Hash} ) { push @final_data => [ map { $Hash->{$key}[$_] || qq[] } 0 .. ( $highest_item - 1 ) ]; } # print out in expected output foreach my $pos ( 0 .. $#final_data ) { foreach ( 0 .. $highest_item - 1 ) { print $final_data[$_][$pos], "\t"; } print $/; }