my $matrix; my %seen_queries; for each row in the excel file: my ($query, $subject, $percent) = values from the excel row $matrix->{$subject}->{$query} = $percent; $seen_queries{$query} = 1; end for #### use Text::Table; my @cols = keys %seen_queries; my $tb = Text::Table->new(@cols); for my $subject (keys %$matrix) { $tb->load( [ @{$matrix->{$subject}}{@cols} ] ); } print $tb; #### use Text::Table; my @cols = keys %$matrix; my $tb = Text::Table->new(@cols); for my $subject (keys %seen_subjects) { my @vals; for my $query {@cols) { push(@vals, $matrix->{$query}->{$subject}); } $tb->load( [ @vals ] ); }