我的perl scipt的执行官对我来说不清楚。它不执行每行一行,我不知道为什么?
代码:
#!usr/bin/perl -w
#line 200 "Level Check"
print "\n1";
$level=554;
if($level > 550){
warn "Level Higher Than 550 ($level)";
}
print "\n2";
输出:
等级高于550(554)等级检查第203行。
1
2
为什么不输出:
1
等级高于550(554)等级检查第203行。
2
答案 0 :(得分:11)
因为STDOUT
是缓冲的。 <{1}}在STDERR
被刷新之前会发出警告。
默认情况下,STDOUT
转到warn()
,STDERR
转到print
。在您当前的代码中,您看到STDOUT
STDERR
您可以通过在顶部添加以下内容来更改该行为:
STDOUT
将select STDERR; $| = 1;
select STDOUT; $| = 1;
和STDOUT
设置为无缓冲并在每次打印时刷新。
答案 1 :(得分:1)
如上所述,你有一个问题是IO缓冲。
另一个问题是,我们的输出(在修复缓冲问题之后)将是:
\n
1Level Higher Than 550 (554) at Level Check line 203.\n
2
而不是:
1\n
Level Higher Than 550 (554) at Level Check line 203.\n
2\n
我猜你在期待。 (为了清楚起见,添加了'\ n')。原因可能很明显......
保
答案 2 :(得分:1)
正如其他人所说,这是因为缓冲。 STDOUT和STDERR都连接到一个终端(AKA tty),并将其输出缓冲到一个换行符;然后打印出来。你有:
print "\n1";
这意味着1将被缓冲直到下一个换行符。如果你写的:
print "1\n";
它会立即打印出来。