http://qs321.pair.com?node_id=1070400

madM has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks..
I know i allready posted something similar but now im trying to print the upper letters of a matrix in a way that the matrix remains formated if the values (numbers) change .. for example in this code if you change the value of A => {A => from 5 to 1500 the matrix would no be formated properly any more thanks for the help!
use strict; use warnings; use Data::Dumper; 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; print ' '; printf "%4s" => $_ for @keys; print "\n"; for my $row (@keys) { print $row; printf "%4s" => $data{$row}{$_} for @keys; print "\n"; } exit;

Replies are listed 'Best First'.
Re: printing upper letter of the matrix
by kcott (Archbishop) on Jan 13, 2014 at 15:24 UTC

    G'day madM,

    I provided that code in "Re: printf matrix". This was in response to your post, "printf matrix", where the largest numerical datum contained two digits.

    If your numerical data may now contain up to four digits (i.e. 2 digits more than previously), how is it possible that you cannot modify the format to accommodate this?

    I suggest you go back to my previous reply and read the documentation regarding formats that I linked to. If, after that, you still can't work it out, please post again specifying exactly the difficulty you're having adding 2 to a number.

    -- Ken

Re: printing upper letter of the matrix
by rnewsham (Curate) on Jan 13, 2014 at 15:11 UTC

    I think Text::Table may do what you want. Here is a basic example based on your code.

    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