Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

Re: Using 2d hash to print a matrix

by atcroft (Abbot)
on Oct 28, 2011 at 07:04 UTC ( #934318=note: print w/replies, xml ) Need Help??

in reply to Using 2d hash to print a matrix

I know it can be done more efficiently, but this appears to do what you are hoping for (hopefully in an understandable way). It differs that it uses the DATA handle instead of a separate file, and prints a space if there was no data for a particular name/set pair.

use strict; use warnings; my %hash; my %found; while (my $line = <DATA>) { chomp $line; next if ($line =~ m/^\s*$/); my @part = split /\s+/, $line; $found{$part[1]}++; $hash{$part[0]}{$part[1]} = $part[2]; } my @sets = sort keys %found; print join(q{ }, q{NAME}, @sets), qq{\n}; foreach my $k (sort keys %hash) { my @data; foreach my $l (@sets) { if (defined $hash{$k}{$l}) { push @data, $hash{$k}{$l}; } else { push @data, q{ }; } } print join(q{ }, $k, @data), qq{\n}; } __DATA__ AA SET1 0 AA SET2 1 AA SET3 0 BB SET1 0 BB SET3 0 CC SET1 2 CC SET2 3

And the output:

NAME SET1 SET2 SET3 AA 0 1 0 BB 0 0 CC 2 3

Replies are listed 'Best First'.
Re^2: Using 2d hash to print a matrix
by angerusso (Novice) on Oct 28, 2011 at 16:30 UTC

    I just finished trying this code for a smaller table. It works perfectly thanks. I am now going to run though it my big file. Thanks again! <\p>

Re^2: Using 2d hash to print a matrix
by angerusso (Novice) on Oct 28, 2011 at 16:59 UTC

    How do you print the tab de-limited values in this code? I did the following but it puts a tab in first column as well instead of just tab limiting after first columns. I am learning about this join command so i apologize for dumb questions.

    print OUTD2 join("\t", q{ }, $k, @data), qq{\n};

      You don't need the 'q{ }' in the line then. The join() command assembles a single string from the second and following parameters using the first parameter as a separator. So, if you said $str = join(q{asdf}, 1, ( 2, 4, 6 ));, then $str would contain '1asdf2asdf4asdf6', or if you said $str = join(q{|}, qw/a s d f z x c v/);, $str would contain 'a|s|d|f|z|x|c|v'. In the line you mention, there would be a space, followed by a tab character, then the value of $k, then a tab character, then the values in @data, separated by tab characters.

      Hope that helps.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://934318]
[Lotus1]: hi

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2018-06-18 15:46 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (110 votes). Check out past polls.