Use
Text::Table.
#! /usr/bin/perl
use strict;
use warnings;
use Text::Table;
my $table = 'Text::Table'->new;
while (<DATA>) {
my @columns = split / +(?!\()/;
$table->add(@columns);
}
print $table;
__DATA__
Package Coverage Line Method Branch
com.gandu.base.alltests 90% 91% (20/22) 50% (1/2) 0
+% (0/0)
...
Update: I used split to process the output of your script to keep the parentheses together with the percentages, but if you use the module and populate the table directly with the values, it gets even simpler.
Instead of
push(@data_table,\@coverage_line);
you'd do
$table->add(@coverage_line);
map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]