Subscribed unsubscribe Subscribe Subscribe

print文でのSTDOUTの出力先を変更する方法

Perl

こういう方法でいいのかな…?

#!/opt/local/bin/perl
use strict;
use warnings;

my $out;

close STDOUT;
open STDOUT, '>', \$out;

print "hoge\n";
print "fuga\n";
print "piyo\n";

$out = scalar reverse $out;

warn $out, "\n";
$ ./handle.pl 

oyip
aguf
egoh

print文の内容はコンソールに現れず、最後のwarnでprintで蓄積した文字列を反転させたものが出力されている。
STDOUTを一度閉じて、変数$outのリファレンスを指定してopenし直すと、print文の出力先(デフォルトでSTDOUTが指定される)が、変数$outに変更される。
それより後の部分ではすべてのprint出力は$outに変更されるので、STDERRで指定しないとコンソールで結果を確認することはできない。


途中で元に戻せるようにするには、一度他のハンドルで保持しておく必要がある、のかな?

#!/opt/local/bin/perl
use strict;
use warnings;

my $out;

open TEMPOUT, '>&STDOUT';
close STDOUT;
open STDOUT, '>', \$out;

print TEMPOUT "temp!";
print "hoge\n";
print "fuga\n";
print "piyo\n";

close STDOUT;
open STDOUT, '>&TEMPOUT';
close TEMPOUT;

$out = scalar reverse $out;

print $out, "\n";

こうすると、実行開始時のSTDOUTは一時的にTEMPOUTというハンドルに渡され、あとでまたそれを使ってopenすることで、元通りにSTDOUTでコンソールに出力できるようになる。

$ ./handle.pl 
temp!
oyip
aguf
egoh


…というのが自分が色々試して得た結論なんだけど、間違ってないだろうか?
もっと一般的な方法とかスマートな方法とかがあるのかなぁ。。