コマンドの実行結果を取得したい!
STDOUT も STDERR も両方とも、でも別々に取得したい!
そんなワガママな私にもアナタにも
たとえばこんなスクリプトを実行すると
use Perl6::Say; use Data::Dumper; my $read = `gcc`; say Dumper($read); # => gcc: no input files # => $VAR1 = '';
と、$read には STDERR の内容が代入されないため、画面にむなしく gcc: no input files の文字だけが表示されることに。。。
ほかにも
use Perl6::Say; use Data::Dumper; my $read = readpipe('ps -u'); say Dumper($read); # => Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ # => $VAR1 = 'USER PID %CPU ... (ps の実行結果がずらずらと)'
なーんてふうに、STDOUT の内容は取得できるんだけど、STDERR の内容は取得することができなかったり。
これに対処するために、STDOUT と一緒にパイプで STDERR を開くなんて技もあるみたいだけれど、それをやってしまうと、どれが STDOUT に出力されたもので、どれが STDERR に出力されたものなのか分からなくなりそうな?
そんなときに、この IO::CaptureOutput を使うと...
use IO::CaptureOutput qw( capture_exec ); use Perl6::Say; my ($stdout, $stderr) = capture_exec('ps', '-u'); say $stderr; # => Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ say $stdout; #=> ... (ps の結果がずらずらと)
と、STDOUT と STDERR の出力結果を別々に取得することができます。
やったね!わーい。
あ、詳しいつづきはCPANで!