我有一个在安装了Perl 5.8.8的旧CentOS 5.6服务器上运行的Perl脚本.不幸的是,我无法升级操作系统或在此服务器上运行的Perl版本.
当我从命令提示符运行此脚本时,尽管$| = 1;脚本顶部有一个语句(在全局范围内),它似乎仍然缓冲输出到控制台(通过ssh会话).
写入日志文件STDOUT并由函数执行,例如:
#!/usr/bin/perl
$| = 1;
&writelog("Started...");
# Do work with lots of writelog'ing
&writelog("...Done.");
exit(0);
sub writelog {
# This is greatly simplified for the purpose of this question
my ($logentry) = @_;
my $logfile = "/var/log/thelog.log";
my $logline = "$logentry\n";
print $logline;
open (LOGFILE, ">>$logfile");
print LOGFILE, "$logline";
close (LOGFILE);
}
Run Code Online (Sandbox Code Playgroud)
值是否$|仅影响当前范围中的输出,即在此情况下脚本的全局范围?或者,在上面的例子中,它是否应该立即刷新STDOUT/ LOGFILE通过print语句writelog?
$| 仅影响当前选定的默认输出文件句柄.
您可以显式设置文件句柄,如:
LOGFILE->autoflush(1);
Run Code Online (Sandbox Code Playgroud)
请参阅http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles
$|不是一个pragma; 更改以"永久"方式$|更改当前selected文件句柄中的标志.默认情况下,该句柄是STDOUT.
您可以使用影响其他文件句柄
use IO::Handle qw( ); # Only required on older versions of Perl.
$handle->autoflush(1);
Run Code Online (Sandbox Code Playgroud)
这是一个捷径
my $temp = select($handle); $| = 1; select($temp);
Run Code Online (Sandbox Code Playgroud)
除了它试图处理异常.
Per具有全局范围perlvar,$|并且仅适用于当前选定的输出通道。它STDOUT位于任何程序的开头,但可以通过 1-argselect调用进行更改。
$| = 1; # set autoflush on STDOUT
open LOGFILE, '>log';
my $fh = select LOGFILE; # change "selected output channel"
$| = 1; # set autoflush on LOGFILE
select $fh; # restore STDOUT as "selected output channel"
$| = 0; # turnoff autoflush on STDOUT
Run Code Online (Sandbox Code Playgroud)