2010-11-06 90 views
2

我覺得應該有一個簡單的方法來做到這一點,但四處搜索並沒有給我帶來好的結果。我只想要open()管道到應用程序,寫入一些數據,並將子進程的輸出發送到調用腳本的STDOUT在Perl中重定向管道的標準輸出

open(my $foo, '|-', '/path/to/foo'); 
print $foo 'input'; # Should behave equivalently to "print 'output'" 
close($foo); 

是否有一個簡單的方法來做到這一點,或者我碰到了Perl中的許多「無法從那裏獲得」時刻?

+0

您的過程輸出到屏幕? – PizzAzzra 2011-02-03 19:41:28

回答

4

子進程將自動繼承STDOUT。這個工作對我來說:

open(my $f, "|-", "cat"); 
print $f "hi\n"; 

如果你是不是真的關閉管道立即這個問題可能是在另一端:stdout是行緩衝默認情況下,讓您可以立即看到print "hello world\n"。你的子進程的管道將是塊緩衝默認情況下,所以你實際上可能是等待您的Perl腳本的數據到達另一方案:

open(my $f, "|-", "cat"); 
print $f "hi\n"; 
sleep(10); 
close($f); # or exit 
# now output appears 

嘗試增加select $f; $| = 1(或者我覺得更現代的方式是$f->autoflush(1)

+0

呵呵。那麼必須是特定應用程序的問題。 – 2010-11-06 19:11:39

+0

增加了另一個想法 - 不確定編輯是否顯示爲通知。 – 2010-11-06 19:28:42

+0

打印管道後,它沒有任何好處:即使perlio使用stdio風格的管道緩衝。 'select((select($ f),$ | = 1)[0])'修復了這個問題。嗯,有沒有錯誤檢查這樣一個異國情調的管道打開的原因是什麼?爲什麼不只是:'open(my $ f,「| cat」)||死「不能打開管貓:$!」;'? – tchrist 2010-11-07 01:15:44

相關問題