Capture::Tinyを使う

標準出力、標準エラー出力への書き込みを別々に
取得したい場合に便利に使えます。

ソース

#!/usr/bin/env perl
use strict;
use warnings;

use Capture::Tiny qw(capture);

my ($stdout, $stderr) = capture {
    warn "message to STDERR";
    print "message to STDOUT";
};

print "STDOUT: $stdout\n";
print "STDERR: $stderr\n";

($stdout, $stderr) = capture {
    my @cmd;
    @cmd = ('ls', '-F', $ENV{HOME} . "/.emacs");
    system @cmd;

    @cmd = qw{ls no_such_file};
    system @cmd;
};

print "STDOUT: $stdout\n";
print "STDERR: $stderr\n";

結果

   % perl capture_tiny.pl
   STDOUT: message to STDOUT
   STDERR: message to STDERR at capture_tiny.pl line 8.

   STDOUT: /Users/syohei/.emacs@

   STDERR: ls: no_such_file: No such file or directory

一からできなくもないことだけど、面倒な処理なので
手っ取り早く、標準出力、標準エラー出力を分けて得たいと
いう場合にはいい選択肢だと思います。