为什么添加或删除换行符会改变perl for for循环函数的方式?

Men*_*hem 3 perl for-loop newline

我开始学习perl,使用perl.org上提供Wrox Beginning Perl,并对第3章中提供的for循环示例提出疑问.

#!/usr/bin/perl

use warnings;
use strict;

my @count = (1..10);
for (reverse(@count)) {
        print "$_...\n";
        sleep 1;
}
print "Blast Off!\n"
Run Code Online (Sandbox Code Playgroud)

这是他们提供的脚本,它按预期工作.它显示一个数字,然后是......每秒钟,在每个数字之间等待一秒钟.完成后,显示Blast Off!

但是,如果我从print语句中删除换行符,则行为会发生变化.该脚本静默等待10秒钟,然后立即显示所有10个数字Blash Off!.为什么要改变?

#!/usr/bin/perl

use warnings;
use strict;

my @count = (1..10);
for (reverse(@count)) {
        print "$_...";
        sleep 1;
}
print "Blast Off!\n"
Run Code Online (Sandbox Code Playgroud)

eld*_*his 11

Perl正在缓冲print输出,并且直到换行符才刷新缓冲区.或者,您可以$| = 1在循环之前添加以告诉Perl刷新print语句之间的缓冲区,从而为您提供具有适当延迟的预期输出:

#!/usr/bin/perl

use warnings;
use strict;

$| = 1; #Add this line
my @count = (1..10);
for (reverse(@count)) {
        print "$_...";
        sleep 1;
}
print "Blast Off!\n"'
Run Code Online (Sandbox Code Playgroud)

  • 更好,更现代:使用IO :: Handle; STDOUT->自动冲洗(1); (2认同)