perl でSTDOUT への出力を一時的に無効にしたい
どうやるんだろう。*STDOUT とかの型グロブを操作するとか、tie を使うなどで出来そうな気がする。普通にclose STDOUT; したら出力は止まるけど、その後 open する方法がわかんないので。。。
追記
一時的に無効にしたい箇所を{}で囲んで、その中でlocal *STDOUTすればいいだけだな。STDERRも同様。
{ local *STDOUT; open STDOUT, '>', undef; print "hoge\n"; # 何も出ない } print "fuga\n"; # fuga
追記終わり。
とりあえず頭に浮かんで、実際書いてみて動いたのはselectを使う方法。ちなみになぜ無効にしたいかと言うと、Net::SSH::Perl でremote host に接続してほげほげ、、、とやろうとした場合に、password 認証に失敗すると、prompt の応答に"Password: " 等と表示されてしまって欝陶しいのでstdout を一時的に止めたいっていう。
open my $fh, '>', '/dev/null' or die; my $stdout_fh = select $fh; ## STDOUT に出る処理する print "foobar\n"; ## select $fh しているので/dev/null 行き ## 元に戻す select $stdout_fh; ## ちゃんとstdout に出る print "hogehoge\n";
- 実行結果
hogehoge