我在perl中有以下两行:
print "Warning: this will overwrite existing files. Continue? [y/N]: \n";
my $input = <STDIN>;
问题是在perl脚本暂停输入之前,打印行没有执行。也就是说,perl脚本似乎无缘无故地无缘无故地停止。我猜测输出是以某种方式缓冲的(这就是为什么我把\ n放入,但这似乎没有帮助)。我对perl很新,所以我很感激有关如何解决这个问题的任何建议。
答案 0 :(得分:24)
默认情况下,STDOUT在连接到终端时进行行缓冲(由LF刷新),在连接到终端以外的其他位置时进行块缓冲(在缓冲区满时刷新)。此外,<STDIN>
在连接到终端时刷新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()
}