Somewhere in the data, there's an EDI_DC40 element that doesn't have all the child nodes. You need to check whether the child exists before calling a method on it:
my @values = map {
my $ch = $thingy->first_child( $_ );
$ch ? $ch->text : ""
} qw( DOCNUM MESTYP SNDPRN RCVPOR RCVPRN );
Also, as I mentioned, you probably don't need to create a new Twig and CSV objects for each file. Declaring the sub inside the loop makes no sense, either.
#!/usr/bin/perl
use warnings;
use strict;
use Text::CSV_XS;
use XML::Twig;
my $csv = 'Text::CSV_XS'->new({
sep_char => '|',
});
sub process_EDI_DC40 {
my ($twig, $thingy) = @_;
my @values = map {
my $ch = $thingy->first_child( $_ );
$ch ? $ch->text : ""
} qw( DOCNUM MESTYP SNDPRN RCVPOR RCVPRN );
$csv->say(*STDOUT, \@values);
}
my $listfile = shift;
open my $list, '<', $listfile or die $!;
my $twig = 'XML::Twig'->new(
twig_handlers => {
EDI_DC40 => \&process_EDI_DC40,
},
);
while (my $xmlfile = <$list>) {
chomp $xmlfile;
$twig->parsefile($xmlfile);
}
($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,
|