2009-08-03 220 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"; 
}