Practice of Programming

プログラム とか Linuxとかの話題

STDERRのテスト

(追記)id:nekokakさんにコメントでTest::Outputを教えていただきました。STDOUT/STDERRのテストができます。
STDERRの場合、stderr_is 無名関数, $message, $name; のように使えるようです。ただ、今回、Carpのテストもあったので、ちょっと使うのはやめました。Carpだと、無名関数が実行されたところ(Test::Output内)に、なってしまうので。それ以外でしたら、断然便利そうでした。

以前書いたのだけど、Script::Carpのテストにも使っている。

my $err;

local *STDERR;
open STDERR, ">", \$err or die $!;

http://d.hatena.ne.jp/ktat/20060829/1156853692

が、これは、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 が答えてくれそうな感じなんですけど、また今度試してみよう。