Perl Print缓冲冲洗

Man*_*noj 5 printing perl buffer

我有以下Perl代码:

STDOUT->autoflush(1);

foreach(...)
{
    ...

    foreach(...)
    {
        print("Processing $folder");
        $|=1;
        process($folder);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

但print语句仅在循环的第一次迭代中起作用,并且在此之后不会打印任何内容.知道为什么吗?

编辑:我找到了原因,并在答案中也添加了它.解决方案是:

我在循环中添加了以下行,它工作正常:

选择STDOUT;

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

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

最终代码如下所示:

foreach(...)
{
    ...

    foreach(...)
    {
        select STDOUT;

        print("Processing $folder");
        $|=1;
        process($folder);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢大家......

dao*_*oad 11

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

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

您可以使用ST ::IO :: Handle接口,而不是select()与作者进行战争:process()

use IO::Handle;

foreach(...)
{
    ...

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

        process($folder);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)


Man*_*noj 5

我在循环中添加了以下行,它工作正常:

select STDOUT;
Run Code Online (Sandbox Code Playgroud)

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

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

最终代码如下所示:

foreach(...)
{
    ...

    foreach(...)
    {
        select STDOUT;

        print("Processing $folder");
        $|=1;
        process($folder);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢大家......