Perl Print缓冲冲洗

时间:2009-08-03 11:15:02

标签: perl printing buffer

我有以下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);
    }
    ...
}
     

谢谢大家......

3 个答案:

答案 0 :(得分:11)

追踪这个问题的好侦探工作!

我想建议一个替代解决方案。

您可以使用IO::Handle界面与STDOUT进行select()战争,而不是与process()作者进行use IO::Handle; foreach(...) { ... foreach(...) { STDOUT->printflush("Processing $folder"); process($folder); } ... } 战争:

{{1}}

答案 1 :(得分:5)

我在循环中添加了以下行,它起作用了:

select STDOUT;

我认为process()函数中的代码应该一直在修改默认的输出缓冲区。这是别人写的代码!

我不确定这是否是Perl的一个问题,它允许这个或开发人员没有将其更改回默认值。

最终代码如下所示:

foreach(...)
{
    ...

    foreach(...)
    {
        select STDOUT;

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

谢谢大家......

答案 2 :(得分: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";
}