use strict; use warnings; use Data::Dumper; use Text::Table; my %data = ( A => { A => 5, R => -2, N => -1 }, R => { A => -2, R => 7, N => -1 }, N => { A => -1, R => -1, N => 7 }, ); my @keys = sort keys %data; my $tb = Text::Table->new( '', @keys ); for my $row (@keys) { my @values; push @values, $data{$row}{$_} for @keys; $tb->load( [$row, @values] ); } print $tb; Output A N R A 5 -1 -2 N -1 7 -1 R -2 -1 7 With A:A changed to 1500 A N R A 1500 -1 -2 N -1 7 -1 R -2 -1 7