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__