tieでSTDOUTをつかまえる

  1. STDIN/STDOUT を使うテスト - tsucchiの日記
  2. はてなブックマーク - kiririmodeのブックマークtie 使えばいけるんじゃないかなー.

を読んで、tieを使ってSTDOUTへの出力を変数に入れておくようなことを、perltie(日本語訳)を参照しつつ書いてみました。

use strict;
use warnings;

{
    # 出力を変数に溜めるためのクラス
    package POOL;
    use overload (
         q{""} => sub { ${$_[0]} }
    );
    sub TIEHANDLE {
        my $str;
        bless \$str, $_[0];
    }
    sub PRINT {
        my $self = shift;
        $$self .= $_ for @_;
    }
}

# テスト対象のサブルーチン
sub add {
    my $total = 0;
    $total += $_ for @_;
    print $total, "\n";
}


# 標準出力を$poolに溜める
use Test::More 'no_plan';
my $pool;
{
    $pool = tie local *STDOUT, 'POOL';
    add(1 .. 10);
    add(1 .. 100);
    add(1 .. 1000);
}
is( $pool, <<'__EOT__' );
55
5050
500500
__EOT__

関連: tieでSTDINを置き換えるIO::Scalarで色々