5

我有以下 Perl 代码:

STDOUT->autoflush(1);

foreach(...)
{
    ...

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

但是 print 语句仅在循环的第一次迭代中有效,之后不再打印任何内容。知道为什么吗?

编辑:我找到了原因并将其添加到答案中。解决方案是:

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

选择标准输出;

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

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

最终代码如下所示:

foreach(...)
{
    ...

    foreach(...)
    {
        select STDOUT;

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

谢谢大家...

4

3 回答 3

11

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

我想提出一个替代解决方案。

您可以使用IO::Handle接口到 STDOUT ,而不是select()与 的作者发生争执:process()

use IO::Handle;

foreach(...)
{
    ...

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

        process($folder);
    }
    ...
}
于 2009-08-03T23:38:19.810 回答
5

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

select STDOUT;

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

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

最终代码如下所示:

foreach(...)
{
    ...

    foreach(...)
    {
        select STDOUT;

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

谢谢大家...

于 2009-08-03T11:34:48.013 回答
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";
}
于 2016-06-10T12:26:24.697 回答