use strictures; use IPC::Open3 qw(open3); use autodie qw(:all); sub execute { my $cmd = shift; my $pid = open3(my($w, $r, $e), $cmd); my @out = defined $r ? <$r> : (); my @err = defined $e ? <$e> : (); waitpid($pid, 0); my $exit_code = $? >> 8; return $exit_code, \@out, \@err; } my ($exit_code, $out, $err) = execute 'some_command';