use strict; use warnings; my $headline = ; my %HoA; while ( ) { s/null/0/g; # no warnings 'numeric'; next unless /^\w/; chomp; my ( $name, @res ) = split /\s*\|\s*/; $HoA{$name} = ! $HoA{$name} ? [ @res ] : [ map { $HoA{$name}[$_] + $res[$_] } 0 .. $#res ]; } print $headline; { local $" = ' | '; print "$_: @{ $HoA{$_} }\n" for ( keys %HoA ); } __DATA__ name | passed | failed | pending -----+--------+--------+--------- xxx | null | 2 | null xxx | 30 | null | null xxx | null | null | 10 yyy| 6 | null | null