你能在 Perl 中强制刷新输出吗?
Can you force flush output in Perl?
我在 Perl 中有以下两行:
print "Warning: this will overwrite existing files. Continue? [y/N]: \n";
my $input = <STDIN>;
问题是在 Perl 脚本暂停输入之前没有执行打印行。也就是说,Perl 脚本似乎无限期地停止,因为没有明显的 reason.I 猜测输出以某种方式被缓冲(这就是为什么我把 \n 放进去,但这似乎没有帮助)。
您可以通过多种方式打开自动刷新:
$|++;
开头,或者还有一个BEGIN
块:
BEGIN{ $| = 1; }
但是,您的配置似乎有些不寻常,因为通常末尾的 \n
会触发刷新(至少是终端)。
默认情况下,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 immediately and after every print.
$| = 1;
use IO::Handle;
STDOUT->flush();
是的。我在我的 util.pl 文件中为此创建了一个子例程,在我所有的 Perl 程序中都是 require
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()
}
对于那些不想在每个 print
之后像保姆一样打电话给 flush()
的人,因为它可能在 loop
之类的地方,而你只是想你的 print
是无缓冲的,然后简单地把它放在你的 perl 脚本的顶部:
STDOUT->autoflush(1);
此后,print
后无需调用 flush()
。
我在 Perl 中有以下两行:
print "Warning: this will overwrite existing files. Continue? [y/N]: \n";
my $input = <STDIN>;
问题是在 Perl 脚本暂停输入之前没有执行打印行。也就是说,Perl 脚本似乎无限期地停止,因为没有明显的 reason.I 猜测输出以某种方式被缓冲(这就是为什么我把 \n 放进去,但这似乎没有帮助)。
您可以通过多种方式打开自动刷新:
$|++;
开头,或者还有一个BEGIN
块:
BEGIN{ $| = 1; }
但是,您的配置似乎有些不寻常,因为通常末尾的 \n
会触发刷新(至少是终端)。
默认情况下,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 immediately and after every print.
$| = 1;
use IO::Handle;
STDOUT->flush();
是的。我在我的 util.pl 文件中为此创建了一个子例程,在我所有的 Perl 程序中都是 require
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()
}
对于那些不想在每个 print
之后像保姆一样打电话给 flush()
的人,因为它可能在 loop
之类的地方,而你只是想你的 print
是无缓冲的,然后简单地把它放在你的 perl 脚本的顶部:
STDOUT->autoflush(1);
此后,print
后无需调用 flush()
。