不清楚perl脚本执行

时间:2011-03-15 19:12:14

标签: perl

我的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

3 个答案:

答案 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";

它会立即打印出来。