XML::LibXML is great for XML processing, but not so great for producing it. Some people prefer
XML::Writer for that, but for a fixed structure like here, you can also use
Template:
#!/usr/bin/perl
use warnings;
use strict;
use Template;
my %data;
<> for 1, 2; # Skip header.
while (<>) {
chomp;
my ($r1, $r2, $r3, $pin, $name, $zip, $date, $time) = split /\t/;
$data{$pin}{reasons} = [ $r1, $r2, $r3 ];
@{ $data{$pin} }{qw{ name zip }} = ($name, $zip);
push @{ $data{$pin}{charge} }, [ $date, $time ];
}
my $template = 'Template'->new;
$template->process(*DATA{IO}, { data => \%data });
__DATA__
<XML_FILE>
[% FOR pin IN data.keys %] <REPORT TYPE="AB">
[%- i = 1 ; FOR r IN data.$pin.reasons %]
<REASON[% i %]>[% r %]</REASON[% i %]>[% i = i + 1; END %]
<PERSON>
<PIN>[% pin %]</PIN>
<NAME>[% data.$pin.name %]</NAME>
<ZIP>[% data.$pin.zip %]</ZIP>
</PERSON>
[% FOR charge IN data.$pin.charge %] <CHARGE>
<DATE>[% charge.0 %]</DATE>
<TIME>[% charge.1 %]</TIME>
</CHARGE>
[% END %] </REPORT>
[% END %]</XML_FILE>
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord
}map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,