# STDOUT と STDERR の保存
open(my $stdout_bak, '>&', \*STDOUT);
open(my $stderr_bak, '>&', \*STDERR);
# STDOUT をファイルへ保存する場合
open(STDOUT, '>', 'stdout.txt');
# STDERR を STDOUT へリダイレクトする場合
open(STDERR, '>&', \*STDOUT);
# STDERR を変数へ保存する場合 (Windows 環境ではうまくいかない場合もあった)
my $stderr;
close(STDERR);
open(STDERR, '>', \$stderr);
# バッファ未使用
select STDERR; $| = 1;
select STDOUT; $| = 1;
# TEST
print 'ZZZ', "\n";
print STDERR 'ERR100', "\n";
# STDOUT と STDERR の復帰
open(STDERR, '>&', $stderr_bak);
open(STDOUT, '>&', $stdout_bak);
# TEST
print 'Recovery STDOUT/STDERR', "\n";
print $stderr;
print 'AAA', "\n";
print STDERR 'ERR2', "\n";