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

为什么添加或删除换行符会改变perl for循环函数的方式?,perl,for-loop,newline,Perl,For Loop,Newline,我开始学习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" 这是他们提供的脚本,它按预期工作。它显示一个数字,后跟。。。每秒钟,在每个数字之间等待一秒钟。完成后,将显示发射

我开始学习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"
这是他们提供的脚本,它按预期工作。它显示一个数字,后跟。。。每秒钟,在每个数字之间等待一秒钟。完成后,将显示
发射

但是,如果我从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"

标准输出是行缓冲的。在看到换行符之前,它不会刷新缓冲区。可以通过在循环之前添加以下行来更正此问题:

my $ofh = select(STDOUT); $| = 1; select $ofh;
我们来分析一下:

my$ofh=select(标准输出)-选择标准输出作为当前选择的文件句柄,并将以前选择的文件句柄存储在
$ofh

$|=1-将当前文件句柄(即STDOUT)设置为无缓冲


选择$ofh
-重新选择之前选择的文件句柄,这样,如果代码在某个点选择了STDOUT以外的文件句柄,那么在这行代码完成后,它仍将被选择。

Perl正在缓冲打印输出,直到换行时缓冲区才被刷新。或者,您可以在循环之前添加
$|=1
,告诉Perl刷新打印语句之间的缓冲区,从而以适当的延迟提供预期的输出:

#!/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"'

在写入终端时,您将看到C stdio库面向行的输出的标准行为


有关perl的详细信息,请参阅。

在STDOUT上使用select()设置自动刷新标志比使用IO::Handle更简洁的方法是使用IO::Handle(自5.004版起,它就包含在perl核心中):


默认情况下,对标准输出进行缓冲。执行“perldoc perlvar”并查找$|要获得更多乐趣,请尝试
print“$\u…\r
(设置自动刷新后);如果有任何其他文件交互,我使用select语句的方式会更安全。甚至更好,更现代:使用IO::Handle;STDOUT->autoflush(1);您可能应该解释
select
s的用途。
use IO::Handle;
STDOUT->autoflush(1)