IO::Capture - 標準出力・標準エラー出力をキャプチャ
標準出力を試験した場合がときどきあります。対話的なプログラミングを作成したり、print をソースコードの中で使用している関数を試験したい場合などです。
標準出力を取得するには、IO::Captureというモジュール使用します。標準出力が取得できれば、いつもどおりの自動試験を行うだけです。
IO::Captureは標準モジュールではないので、
cpan IO::Capture
でインストールします。
1. 標準出力をキャプチャする
標準出力を取得するには、IO::Capture::Stdoutモジュールを使用します。IO::Captureモジュールをインストールすると一緒についてきます。
startメソッドでキャプチャ開始、stopメソッドでキャプチャ終了です。そのあとに、readメソッドを呼び出すと、キャプチャした標準出力を取得できます。
use IO::Capture::Stdout; my $capture = IO::Capture::Stdout->new; $capture->start; print "aaa"; $capture->stop; my $stdout = $capture->read;
複数回の標準出力を取得したい場合は以下のように記述できます。
$capture->start; print "aaa"; print "bbb"; $capture->stop; my @stdout = $capture->read;
リストコンテキストで、readを呼び出すと、("aaa", "bbb") が取得できます。
標準の機能だけを使って標準出力をキャプチャする方法
モジュールを使わないで、標準の機能だけを使って標準出力をキャプチャする方法も存在したので、記述しておきます。
open関数で、STDOUTの出力先を切り替える方法です。
my $stdout; # STDOUTのキャプチャを開始 open my $temp, '>&', STDOUT; close STDOUT; open STDOUT, '>', \$stdout; print "hoge"; # STDOUTのキャプチャを終了 close STDOUT; open STDOUT, '>&', $temp; close $temp; print $stdout; # "hoge"が出力
2. 標準エラー出力をキャプチャする
IO::Capture::Stderr を使って同じようにできます。
use IO::Capture::Stderr; my $capture = IO::Capture::Stderr->new; $capture->start; print STDERR "aaa"; $capture->stop; my $stderr = $capture->read;
標準の機能だけを使って標準エラー出力をキャプチャする方法
モジュールを使わないで、標準の機能だけを使って標準エラー出力をキャプチャする方法も存在したので、記述しておきます。
open関数で、STDERRの出力先を切り替える方法です。
my $stderr; # Start capture STDERR open my $temp, '>&', STDERR; close STDERR; open STDERR, '>', \$stderr; print STDERR "hoge"; # End capture STDERR close STDERR; open STDERR, '>&', $temp; close $temp; print $stderr; # "hoge" が出力