can you force flush output in perl

2019-03-24 21:32发布

I have the following two lines in perl:

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

The problem is that the print line does not get executed before the perl script pauses for input. That is, the perl script just seems to stop indefinitely for no apparent reason. I'm guessing that the output is buffered somehow (which is why I put the \n in, but that doesn't seem to help). I'm fairly new to perl, so I would appreciate any advise on how to get around this issue.

3条回答
孤傲高冷的网名
2楼-- · 2019-03-24 21:53

By default, STDOUT is line-buffered (flushed by LF) when connected to a terminal, and block-buffered (flushed when buffer gets full) when connected to something other than a terminal. Furthermore, <STDIN> flushes STDOUT when it's connected to a terminal.

This means

  • STDOUT isn't connected to a terminal,
  • you aren't printing to STDOUT, or
  • STDOUT's been messed with.

print prints to the currently selected handle when no handle is provided, so the following will work no matter which of the above is true:

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

or

# Execute anytime before the <STDIN>.
# Causes the currently selected handle to be flushed after every print.
$| = 1;
查看更多
混吃等死
3楼-- · 2019-03-24 21:53

There are several ways you can turn on autoflush:

$|++;

at the beginning, or also with a BEGIN block:

BEGIN{ $| = 1; }

However, it seems to be something unusual with your configuration, because usually a \n at the end triggers the flushing (at least of the terminal).

查看更多
萌系小妹纸
4楼-- · 2019-03-24 22:07
use IO::Handle;
STDOUT->flush();
查看更多
登录 后发表回答