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 ####
A B name1
C D name2
E F name3
G H name4
I J name5