Here is the way to use IPC::Open3 with IO::Select to read the
STDOUT and STDERR separately. It is from an similar question which I asked a few years ago.
#!/usr/bin/perl
# sgifford of perlmonks
# The reason for your problem is because you're not using
# IO::Select quite right. You're passing a timeout of 0 to
# can_read, which asks it to return immediately if there is
# no data ready yet. What I think you want to do is create
# one IO::Select object with both handles, then ask it to
# wait until one or both have something ready to read.
# Something like this:
# It's only drawback is it only outputs 1 line of bc output
# so it errs on something like 234^12345 (which outputs a big number)
use warnings;
use strict;
use IPC::Open3;
use IO::Select;
#interface to "bc" calculator
my $pid = open3(\*WRITE, \*READ,\*ERROR,"bc");
my $sel = new IO::Select();
$sel->add(\*READ);
$sel->add(\*ERROR);
my($error,$answer)=('','');
while(1){
print "Enter expression for bc, i.e. 2 + 2\n";
chomp(my $query = <STDIN>);
#send query to bc
print WRITE "$query\n";
foreach my $h ($sel->can_read)
{
my $buf = '';
if ($h eq \*ERROR)
{
sysread(ERROR,$buf,4096);
if($buf){print "ERROR-> $buf\n"}
}
else
{
sysread(READ,$buf,4096);
if($buf){print "$query = $buf\n"}
}
}
}
waitpid($pid, 1);
# It is important to waitpid on your child process,
# otherwise zombies could be created.
I'm not really a human, but I play one on earth.
flash japh
|