为什么添加或删除换行符会改变perl for循环函数的方式?
我开始学习perl,使用了,并且有一个关于第3章中提供的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" 这是他们提供的脚本,它按预期工作。它显示一个数字,后跟。。。每秒钟,在每个数字之间等待一秒钟。完成后,将显示发射
#!/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)