use strict;
use warnings;
use Spreadsheet::HTML qw(generate);
my @data = map { chomp; s/(?:COMMENT|[&\\_@])//g; [split /:/] } ;
my @class = map { map $_ ? 'norm' : 'bold', splice @$_, 0, 1 } @data;
my @frag = map { splice @$_, 2, 1 } @data;
print generate(
data => \@data,
matrix => 1,
indent => ' ',
tr => { class => \@class },
-c2 => sub { sprintf '%s', shift(@frag), shift }
);
__DATA__
0:A:B:frag1:name1
1:C:D:frag2:name2
0:E:F:fr&ag3:naCOMMENTme3
1:G:H:fr\ag4:_name4
0:I:J:fr@ag5:name5