2012-07-12 48 views
2

我有一個Perl腳本,它必須包裝一個PHP腳本,產生大量輸出,並且需要大約半小時才能運行。Perl - 從外部進程直接輸出到標準輸出(避免緩衝)

在那一刻,我脫殼而出有:

print `$command`; 

這個作品在這個意義上,PHP腳本調用,它確實它的工作,但是,沒有被Perl渲染,直到PHP輸出腳本在半小時後完成。

有沒有一種方法可以解決這個問題,以便在PHP收到輸出後立即通過perl輸出?

回答

2

你真的在做print `$command`

如果您只運行一個命令並且沒有捕獲它的任何輸出,只需使用system $command即可。它將直接寫入stdout而不通過Perl。

+0

是的,我確實正在做我說我在做我的問題是的,是的,這是一個明智的做法。感謝這個解決方案 - 非常簡單,它完美的工作! – 2012-07-13 12:04:16

8

問題是,Perl不會完成閱讀,直到PHP腳本終止,並且只有當它完成閱讀後纔會寫入。反引號操作符會阻塞,直到子進程退出,並且沒有任何魔術可以隱式地進行讀/寫循環。

所以你需要寫一個。嘗試管道打開:

open my $fh, '-|', $command or die 'Unable to open'; 
while (<$fh>) { 
    print; 
} 
close $fh; 

然後,這應該讀取每一行,如PHP腳本寫入它,並立即輸出它。如果PHP腳本沒有以方便的方式輸出,並且想要使用單個字符輸出,則需要使用read從文件句柄中獲取數據,並禁用stdout上的輸出緩衝($| = 1)以編寫它。

http://perldoc.perl.org/perlipc.html#Using-open()-for-IPC

0

見你可能想調查Capture::Tiny。 IIRC這樣的事情應該工作:

use strict; 
use warnings; 

use Capture::Tiny qw/tee/; 

my ($stdout, $stderr, @result) = tee { system $command }; 

其實,只是用system可能不夠好,因人而異。