2009-08-03 133 views
3

我有以下的Perl代码:Perl的打印缓冲冲

STDOUT->autoflush(1); 

foreach(...) 
{ 
    ... 

    foreach(...) 
    { 
     print("Processing $folder"); 
     $|=1; 
     process($folder); 
    } 
    ... 
} 

但print语句只能在循环的第一次迭代,并且不打印后的事情。任何想法为什么?

编辑:我找到了原因,并在答案中也加入了它。 将溶液:

添加以下行 循环内,并且它的工作:

选择STDOUT;

我认为process()函数 中的代码应该已经修改了默认的 输出缓冲区。这是其他人写的 的代码!

我不知道这是用Perl问题 允许这个或 开发商谁没有改回 为默认值。

最后的代码是这样的:

foreach(...) 
{ 
    ... 

    foreach(...) 
    { 
     select STDOUT; 

     print("Processing $folder"); 
     $|=1; 
     process($folder); 
    } 
    ... 
} 

感谢所有...

+0

你肯定有更多的比一次迭代? – innaM 2009-08-03 11:23:15

回答

10

优秀的侦探工作!

我想推荐一个备用解决方案。

与其具有的process()笔者select()战争,你可以使用IO::Handle接口输出到标准输出:

use IO::Handle; 

foreach(...) 
{ 
    ... 

    foreach(...) 
    { 
     STDOUT->printflush("Processing $folder"); 

     process($folder); 
    } 
    ... 
} 
4

我添加以下行内环路和它的工作:

select STDOUT; 

我想process()函数中的代码应该已经修改了默认输出缓冲区。这是其他人写的代码!

我不确定这是Perl允许的问题还是开发人员没有将其更改回默认值。

最后的代码是这样的:

foreach(...) 
{ 
    ... 

    foreach(...) 
    { 
     select STDOUT; 

     print("Processing $folder"); 
     $|=1; 
     process($folder); 
    } 
    ... 
} 

感谢所有...在追查这个问题

0

我的代码如下所示:

#!/usr/bin/perl -w 

use strict; 
use warnings; 
use sigtrap qw/handler signal_handler normal-signals/; 
use feature qw(say); 

my $datetime; 
$datetime = localtime(); 

say "tester started $datetime"; 

while (1) { 
    select STDOUT; 
    $datetime = localtime(); 
    say "tester output every second $datetime"; 
    $|=1; 
    sleep (1); 
} 

sub signal_handler { 
    die "\nCaught a signal $!\n"; 
}