うまいぼうぶろぐ

linuxとhttpdとperlのメモ

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