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

I have this section of code to fill hash into an array

my (@array); while(<IN>){ chomp $_; my @cols = split("\t", $_); my $data = join("\t", $cols[2], $cols[5]); push (@array, {$cols[0]=>$data}); # to keep multiple entries for the +same key } close(IN); foreach my $key(@array){ foreach my $value(keys %$key){ print $value, "\t", $key->{$value}, "\n"; #here how can I join values for the same key? #similar to OUTPUT shown below } } INPUT p1 cis 10 p1 plat 20 p1 gls NA p2 cis 0 p2 NA 9 OUTPUT p1 cis,plat,gls 10,20,NA p2 cis,NA 0,9

I would appreciate any help!

Replies are listed 'Best First'.
Re: How to join values of the same key that is an array of hashes?
by toolic (Bishop) on Jan 04, 2014 at 15:04 UTC
    use warnings; use strict; my %data; while (<DATA>) { my @cols = split; push @{ $data{$cols[0]} }, {$cols[1] => $cols[2]}; } for (sort keys %data) { my @ks; my @vs; for my $href (@{ $data{$_} }) { push @ks, keys %{ $href }; push @vs, values %{ $href }; } print "$_ ", join(',', @ks), " ", join(',', @vs), "\n"; } __DATA__ p1 cis 10 p1 plat 20 p1 gls NA p2 cis 0 p2 NA 9
Re: How to join values of the same key that is an array of hashes?
by kcott (Archbishop) on Jan 05, 2014 at 08:16 UTC

    G'day BhariD,

    Your "INPUT" data doesn't look like input data but a vague representation of data partway through processing. Your "OUTPUT" data doesn't show the structure you want. Making guesses for both of these:

    #!/usr/bin/env perl use strict; use warnings; my %tmp; while (<DATA>) { chomp; my ($k0, $k, $v) = (split /\t/)[0, 2, 5]; $tmp{$k0}{k} = exists $tmp{$k0}{k} ? join ',' => $tmp{$k0}{k}, $k +: $k; $tmp{$k0}{v} = exists $tmp{$k0}{v} ? join ',' => $tmp{$k0}{v}, $v +: $v; } my %out = map { $_ => { $tmp{$_}{k} => $tmp{$_}{v} } } keys %tmp; # For testing use Data::Dumper; print Dumper \%out; __DATA__ p1 X cis X X 10 p1 X plat X X 20 p1 X gls X X NA p2 X cis X X 0 p2 X NA X X 9

    Output:

    $VAR1 = { 'p1' => { 'cis,plat,gls' => '10,20,NA' }, 'p2' => { 'cis,NA' => '0,9' } };

    -- Ken

Re: How to join values of the same key that is an array of hashes?
by Anonymous Monk on Jan 05, 2014 at 04:18 UTC

    Or this:

    use warnings; use strict; my %h; while (<DATA>) { my @cols = split; push @{ $h{ shift @cols } }, \@cols; } print $_, ' ', join( ' ' => map { $_->[0] } @{ $h{$_} } ), ' ', join( ' ' => map { $_->[1] } @{ $h{$_} } ), $/ for sort { $a cmp $b } keys %h; __DATA__ p1 cis 10 p1 plat 20 p1 gls NA p2 cis 0 p2 NA 9