You might try IO::Pty to fake it out. Here is a simple example, but you might want to google for better ones.
#!/usr/bin/perl
use IO::Handle;
use IO::Pty;
sub do_cmd() {
my $pty = new IO::Pty;
defined( my $child = fork ) or die "Can't fork: $!";
if ($child){
$pty->close_slave(); #needed to close
return $pty;
}
POSIX::setsid();
my $slave = $pty->slave;
close($pty);
STDOUT->fdopen( $slave, '>' ) || die $!;
STDERR->fdopen( \*STDOUT, '>' ) || die $!;
system("echo This is stdout output from an external program");
exit 0;
}
my $fh = do_cmd();
while (<$fh>) { print; }
|