メメメモモ

プログラミング、筋トレ、ゲーム、etc

STDERRの出力を変数に入れる方法

やり方が分からなかったので、
「STDERRの出力を変数に入れるにはどうしたらいいんだろうなぁ(チラッチラッ」
とツイッターでつぶやいていたら、
@hide_o_55さんと@punytanさんのお二方に教えていただきました。
どうもありがとうございます!


方法は以下の2通りです。

use Test::More tests => 2;
use strict;
use warnings;


# STDERRを使う

{
    local *STDERR;

    my $stderr;
    open STDERR, '>', \$stderr or die $!;

    warn 'error';

    like $stderr, qr/^error/;
}


# $SIG{__WARN__}を使う

{
    my $stderr;
    local $SIG{__WARN__} = sub { $stderr = shift; };

    warn 'error';

    like $stderr, qr/^error/;
}


warnで出力される文字列が、変数$stderrに格納されることが確認できました。