32

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

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

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

4

5 に答える 5

46

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

これの意味は

  • STDOUT は端末に接続されていません。
  • STDOUTに出力していない、または
  • STDOUT が台無しになっています。

printselectハンドルが提供されていない場合は、現在編集されているハンドルに出力されるため、上記のどれが当てはまるかに関係なく、次のように動作します。

# 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;
于 2015-11-19T19:30:17.493 に答える
15

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

$|++;

最初に、またはBEGINブロックでも:

BEGIN{ $| = 1; }

\nただし、通常、最後に a が(少なくとも端末の)フラッシュをトリガーするため、構成では異常なようです。

于 2015-11-19T19:26:35.280 に答える
1

はい。このためのサブルーチンを util.pl ファイルに作成しました。このファイルはrequire、すべての Perl プログラムで d になっています。

###########################################################################
# 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()
}

于 2019-09-09T16:33:51.280 に答える