perl – 为什么在STDERR线之后打印STDOUT线?

前端之家收集整理的这篇文章主要介绍了perl – 为什么在STDERR线之后打印STDOUT线?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我完全不理解这种行为.

我有一个非常简单的Perl脚本:

#!/usr/bin/perl

use strict;
use warnings;

print "line 1\n";
print STDERR "line 2\n";

如果我从控制台运行它,我会得到我期望的:

$perl a.pl
line 1
line 2

但如果我将其重定向文件,我将按相反的顺序获取行:

$perl a.pl &> a
$cat a
line 2
line 1

如何使用相同的方法将所有输出STDOUT STDERR捕获到文件
我订进控制台?

解决方法

这是缓冲的效果.当输出到终端时,Perl(就像stdio一样)使用基于行的缓冲,这将产生预期的效果.输出文件时,它使用块缓冲(通常为4k或8k块),因此它只会在程序结束时刷新.

您观察到的差异是因为STDERR是无缓冲的,与大多数其他句柄不同.

解决此问题的最简单方法是使用$|在STDOUT上启用自动刷新特殊变量.有关详细信息,请参见perlvar.

猜你在找的Perl相关文章