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

perl中使用代码块警告和打印的奇怪行为,perl,Perl,程序: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";

程序: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.

我无法理解这里的问题。欢迎您提供任何意见或建议。

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


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

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


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

也许你应该提到
print
转到
STDOUT
warn
转到
STDERR
。也许你应该提到
print
转到
STDOUT
warn
转到
STDERR