我在一个安装了Perl5.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);
}$|的值是否只影响当前范围中的输出,即在这种情况下脚本的全局范围?或者,在上面的示例中,它是否也会导致STDOUT/LOGFILE被writelog中的print语句立即刷新
发布于 2017-06-19 15:55:20
根据perlvar,$|具有全局范围,它仅适用于当前选定的输出通道。这是STDOUT在任何程序的开头,但可以通过1-arg select调用进行更改。
$| = 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发布于 2017-06-19 15:52:54
$|只影响当前选定的默认输出文件句柄。
您可以显式地将其设置为文件句柄,如:
LOGFILE->autoflush(1);请参阅http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles
发布于 2017-06-19 15:53:07
$|不是一个实用程序;更改$|将以“永久”的方式更改当前selected文件句柄中的标志。默认情况下,该句柄为STDOUT。
可以通过以下方式影响其他文件句柄
use IO::Handle qw( ); # Only required on older versions of Perl.
$handle->autoflush(1);这是一条捷径
my $temp = select($handle); $| = 1; select($temp);只是它试图处理异常。
https://stackoverflow.com/questions/44634898
复制相似问题