web-dev-qa-db-ja.com

あなたはperlでフラッシュ出力を強制できますか

Perlには次の2行があります。

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

問題は、Perlスクリプトが入力のために一時停止する前に、印刷行が実行されないことです。つまり、Perlスクリプトは、明確な理由なしに無期限に停止するように見えるだけです。出力がどういうわけかバッファリングされていると思います(そのため、\ nを入れましたが、それは役に立たないようです)。私はPerlにかなり慣れていないので、この問題を回避する方法についてのアドバイスをいただければ幸いです。

20
John

デフォルトでは、STDOUTは、端末に接続するとラインバッファリング(LFによってフラッシュ)され、端末以外に接続するとブロックバッファ(バッファがいっぱいになるとフラッシュ)になります。さらに、<STDIN>は、端末に接続されているときにSTDOUTをフラッシュします。

これの意味は

  • STDOUTは端末に接続されていません。
  • sTDOUTに出力しない、または
  • STDOUTはめちゃくちゃです。

printは、ハンドルが指定されていない場合、現在のselectedハンドルに出力するため、上記のいずれが当てはまる場合でも、以下が機能します。

# 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 after every print.
$| = 1;
26
ikegami

自動フラッシュをオンにする方法はいくつかあります。

$|++;

冒頭、またはBEGINブロックでも:

BEGIN{ $| = 1; }

ただし、通常は\n最後に(少なくとも端末の)フラッシュをトリガーします。

8
Diego Sevilla
use IO::Handle;
STDOUT->flush();
2
Gábor

はい。私はすべてのPerlプログラムでrequiredであるutil.plファイルでこのサブルーチンを作成しました。

###########################################################################
# In: File handle to flush.
# Out: blank if no error,, otherwise an error message. No error messages at this time.
# Usage: flushfile($ERRFILE);
# Write any file contents to disk without closing file. Use at debugger Prompt
# or in program.
sub flushfile
{my($OUTFILE)=@_;
my $s='';

my $procname=(caller(0))[3]; # Get this subroutine's name.

my $old_fh = select($OUTFILE);
$| = 1;
select($old_fh);

return $s; # flushfile()
}

0
Bulrush