2011-11-17 184 views
3

我想本地方式來解決這個問題...Perl - 控制檯輸出?

我有一個perl命令,打一個電話,有時,直接打印出來的文本到控制檯。

我想是這樣的:

$text = get_output_from(MagicCommandICan'tChange()); 
if ($text neq "a specific value") { 
    print $text; 
} 

沒有辦法做到這一點?

+1

考慮改寫的問題。從你的問題描述中,我認爲你並不是真的想要抑制控制檯輸出,而是想要捕獲它。 – MetaEd

+0

你真的應該說MagicCommandICan'tChange()是什麼樣的命令。 Perl的?系統? – TLP

回答

7

IO::CaptureOutput

use IO::CaptureOutput qw(capture qxx qxy); 

# STDOUT and STDERR separately 
capture { noisy_sub(@args) } \$stdout, \$stderr; 
+3

['Capture :: Tiny'](http://p3rl.org/Capture:Tiny) – daxim

+0

完美。哦,貝爾,你是如此強大和邪惡。 – Jeremy

2

我假設這個Perl腳本正在調用外部可執行文件。如果輸出打印在stdout上,則可以使用反引號操作符或qx來運行該命令並捕獲輸出。在Unix系統上,您可以使用system(),並使用>運算符將輸出重定向到/dev/null。您也可以撥打open使用以下命令:

如果文件名開頭「|」,文件名被解釋爲 命令,其輸出是用管道,如果文件名 結尾的「| ',文件名被解釋爲 管道輸出給我們的命令。有關這方面的更多示例,請參閱perlipc中的「使用open()for IPC」的 。 (您不允許「打開」 命令,該命令可以輸入和輸出,但可以在perlipc中查看IPC :: Open2, IPC :: Open3以及「與另一個 過程的雙向通信」)

最後,您可以關閉並重新打開STDOUT和STDERR文件句柄(編輯IO::CaptureOutput以下推薦)。雖然這有點奇怪,我不會推薦它作爲最好的選擇。