コマンド実行結果の標準出力と標準エラー出力をそれぞれ取得する


 IPC::Open3モジュールを使うと取得できます。
 IPC::Cmdモジュールというのもあってこちらの方がすっきりかけるのですが、手元のWindows環境(Windows 7 + Active Perl v5.10.1)では結果が取得できなかったのでIPC::Open3を使う方法を紹介します。
 なお下記の書き方では標準エラー出力に出力される結果のサイズが一定量を超えるとブロッキングが発生してプログラムが停止します。確実にこの現象を避けるのであればselect関数を使うかO::Selectモジュールを使って下さい。
use strict;
use warnings;
use Symbol;
use IPC::Open3;

my $cmd = "netstat";
my @opt = qw(-an);

my ($in, $out, $err);
$err = gensym;

my $pid = open3($in, $out, $err, $cmd, @opt);

my @out_buff = <$out>;
my @err_buff = <$err>;

waitpid $pid, 0;

close $in;
close $out;
close $err;

print "[stdout]\n";
print @out_buff;

print "[stderr]\n";
print @err_buff;

関連項目

qxクオート演算子
system関数
コマンドを実行する