1. ホーム
  2. perl

[解決済み] Perlで強制的にフラッシュ出力することはできますか?

2022-02-08 03:03:57

質問

Perlで以下の2行があります。

print "Warning: this will overwrite existing files.  Continue? [y/N]: \n";
my $input = <STDIN>;

問題は、Perl スクリプトが入力のために一時停止する前に、print 行が実行されないことです。つまり、Perlスクリプトは明確な理由もなく無期限に停止するようです。私は、出力が何らかの形でバッファリングされていると推測しています(そのため、"the \n" を入れましたが、それは助けにならないようです)。

解決方法は?

STDOUTは、デフォルトでは、ターミナルに接続した場合はラインバッファ(LFでフラッシュ)、ターミナル以外に接続した場合はブロックバッファ(バッファが一杯になったらフラッシュ)になっています。さらに <STDIN> は、端末に接続されたときにSTDOUTをフラッシュします。

これはつまり

  • STDOUTがターミナルに接続されていない。
  • STDOUTにプリントしていない、または
  • STDOUTがいじられている。

print を現在表示しています。 select ハンドルが提供されない場合、編集されたハンドルが提供されるので、以下は上記のいずれが真であっても動作します。

# Execute after the print.
# Flush the currently selected handle.
# Needs "use IO::Handle;" in older versions of Perl.
select()->flush();

または

# Execute anytime before the <STDIN>.
# Causes the currently selected handle to be flushed immediately and after every print.
$| = 1;