こういう方法でいいのかな…?
#!/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
…というのが自分が色々試して得た結論なんだけど、間違ってないだろうか?
もっと一般的な方法とかスマートな方法とかがあるのかなぁ。。