用perl中的代码块警告和打印的奇怪行为

时间:2013-01-08 09:12:11

标签: perl

program:testblocks.pl

#!/usr/bin/perl
use strict;
use warnings;

print "Hi";

BEGIN {
        warn "BEGIN";
}
END {
        warn "END";
}
INIT {
        warn "INIT";
}
CHECK {
        warn "CHECK";
}
UNITCHECK {
        warn "UNITCHECK";
}

print "Hello";

输出:

BEGIN at testblocks.pl line 8. 
CHECK at testblocks.pl line 17. 
INIT at testblocks.pl line 14. 
UNITCHECK at testblocks.pl line 20. 
END at testblocks.pl line 11. 
HiHello

现在,如果我在下面的打印语句中使用\n

print "Hi\n";
...
print "Hello\n";

输出是:

BEGIN at testblocks.pl line 8.
CHECK at testblocks.pl line 17.
INIT at testblocks.pl line 14.
Hi 
UNITCHECK at testblocks.pl line 20.
Hello 
END at testblocks.pl line 11.

我无法理解这里的问题。任何意见或建议。

1 个答案:

答案 0 :(得分:6)

它看起来像打印缓冲区问题。当您在打印中包含换行符时,缓冲区会立即刷新。在第一种情况下,如果没有换行符,它们会在满员时或者程序退出时刷新。

作为dgw注释,由于warn转到STDERR并打印到STDOUT,它们也不在同一个缓冲区中。