use Carp; use IO::Handle; use IPC::Open3; use strict; my $STDOUT = IO::Handle->new; my $STDERR = IO::Handle->new; open($STDOUT, ">&STDOUT") || croak( 'Cannot duplicate STDOUT to file handle - ', $! ); open($STDERR, ">&STDERR") || croak( 'Cannot duplicate STDERR to file handle - ', $! ); eval { open3( '<&STDIN', $STDOUT, $STDERR, "some_application" ) || die $!; waitpid(-1, 0); }; croak( 'Cannot execute command - ', $@ ) if $@; # The STDOUT and STDERR output of some_application # execution now resides in $STDOUT and $STDERR # respectively. eg. print $_ foreach <$STDOUT>