2010-08-18 45 views

回答

11

如果有問題的代碼不使用STDOUT明確的(即,它只是print "..."),你可以使用select更改print使用文件句柄:

my $output; 
open(my $outputFH, '>', \$output) or die; # This shouldn't fail 
my $oldFH = select $outputFH; 
call_code_that_prints(); 
select $oldFH; 
close $outputFH; 

print $output; # Here's what we collected 

使用select使得它更容易恢復STDOUT之後。關閉並重新打開標準輸出很難撤銷。請注意,select不會影響STDOUT本身,因此它不會影響外部進程,但是您說沒有任何。它也不會影響類似print STDOUT "..."的代碼。

如果select方法不足以滿足您的需求,我建議您嘗試Capture::Tiny。它可以捕獲外部程序和顯式寫入STDOUT的代碼的輸出。但它不能(當前)只捕獲STDOUT;它總是捕獲STDOUT和STDERR(分開或合併爲一個字符串)。

16

新的,很酷的方式來處理這個是Capture::Tiny。您可以通過手術來影響您需要的程序部分,而不會影響其他任何內容。但是,我可能會做什麼cjm recommends,因爲它不需要一個模塊。

+1

使用Capture :: Tiny的一個問題是,它無法僅捕獲STDOUT並將STDERR留下。它總是捕獲兩者,分別或合併。 – cjm 2010-08-18 17:16:04

+1

呃,直到有人提交補丁。 [RT#60515](https://rt.cpan.org/Ticket/Display.html?id=60515):) – 2010-08-19 12:28:52

+0

跟進... Capture :: Tiny已在上述評論後的某個時間更新。它可以抓取STDOUT,並通過'capture_stdout'使STDERR獨立。還有其他變體,取決於你想要做什麼。非常有用的模塊。 – 2011-12-30 02:58:22

相關問題