你能用perl强制刷新输出吗?

时间:2015-11-19 19:22:28

标签: perl flush autoflush

我在perl中有以下两行:

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

问题是在perl脚本暂停输入之前,打印行没有执行。也就是说,perl脚本似乎无缘无故地无缘无故地停止。我猜测输出是以某种方式缓冲的(这就是为什么我把\ n放入,但这似乎没有帮助)。我对perl很新,所以我很感激有关如何解决这个问题的任何建议。

5 个答案:

答案 0 :(得分:24)

默认情况下,STDOUT在连接到终端时进行行缓冲(由LF刷新),在连接到终端以外的其他位置时进行块缓冲(在缓冲区满时刷新)。此外,<STDIN>在连接到终端时刷新STDOUT。

这意味着

  • STDOUT未连接到终端,
  • 您没有打印到STDOUT或
  • STDOUT被搞乱了。
当没有提供句柄时,

print将打印到当前select ed句柄,因此无论上述哪一项都适用,以下内容将起作用:

# 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;

答案 1 :(得分:8)

有几种方法可以启用autoflush:

$|++;

在开头,或者还有BEGIN块:

BEGIN{ $| = 1; }

但是,您的配置似乎有些不寻常,因为通常最后\n会触发刷新(至少是终端)。

答案 2 :(得分:2)

对于那些不想像婴儿保姆一样在每个kubectl delete pod demo-microservice之后打电话给flush()的人,因为它可能在print之内,或者您只是想让自己的{ {1}}进行缓冲,然后将其放在您的perl脚本的顶部:

loop

此后,无需在print之后调用STDOUT->autoflush(1);

答案 3 :(得分:1)

use IO::Handle;
STDOUT->flush();

答案 4 :(得分:0)

是的。我在util.pl文件中为此创建了一个子例程,该文件在我所有的Perl程序中都为require

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