(追記)id:nekokakさんにコメントでTest::Outputを教えていただきました。STDOUT/STDERRのテストができます。
STDERRの場合、stderr_is 無名関数, $message, $name; のように使えるようです。ただ、今回、Carpのテストもあったので、ちょっと使うのはやめました。Carpだと、無名関数が実行されたところ(Test::Output内)に、なってしまうので。それ以外でしたら、断然便利そうでした。
以前書いたのだけど、Script::Carpのテストにも使っている。
my $err;
local *STDERR;
http://d.hatena.ne.jp/ktat/20060829/1156853692
open STDERR, ">", \$err or die $!;
が、これは、5.8以降でのみ使えるやり方なんですよね。
Script::CarpをCPANにあげたら、5.6.2でエラーとなってしまった。忘れてた。
さて、5.8以上必須にしてしまうか、それとも、IO::Scalarか、IO::Stringを使うか。
use IO::Scalar; my $err; { local *STDERR; my $io = tie *STDERR, 'IO::Scalar', \$err; warn 123; } print "---", $err;
IO::Stringの場合は、
use IO::String; my $err; { local *STDERR; my $io = tie *STDERR, 'IO::String'; $io->open($err); warn 123; } print "---", $err
どちらも、tieを使って、ファイルハンドルと結び付けられます。
普段は、IO::Scalarをよく使っているのですが、一般的にどっちが多いんだろうか。
IO::Scalarのが使われている気がしないでもないけど、どうなんだろうなーという疑問は、Module::Dependency が答えてくれそうな感じなんですけど、また今度試してみよう。