my $IN = IO::File->new_tmpfile;
####
local *OUT;
open OUT, ">output.log";
####
sub callexternalpgm {
my ( $cmd, $cmdargs, $rawdata, $processeddata, $err ) = @_;
my ( $IN, $OUT, $ERR );
$ERR = gensym();
my $pid;
eval{ $pid = open3( $IN, $OUT, $ERR, $cmd, @{ $cmdargs } ) };
return $@ if $@;
print $IN $rawdata;
close $IN;
my $select = new IO::Select;
$select->add( $OUT, $ERR );
while(my @ready = $select->can_read) {
foreach my $fh (@ready) {
my $data;
my $length = sysread $fh, $data, 4096;
if( ! defined $length || $length == 0 ) {
$err .= "Error from child: $!\n" unless defined $length;
$select->remove($fh);
} else {
if($fh == $OUT) {
$processeddata .= $data;
} elsif($fh == $ERR) {
$err .= $data;
} else {
return undef;
}
}
}
}
waitpid $pid, 0; # wait for it to die
warn $err if $err;
return 1;
}