2014-10-02 72 views
-2

它似乎有問題檢索我在我的Perl腳本中執行的另一個應用程序的輸出。檢索另一個程序的輸出的最佳方法

我試着使用

# Option 1: 
open(FH, "program -paramaeters |") or warn("$!"); 
while (my $line = <FH>) { print $line } 

# Option 2: IPC::Run3's 
run3(\@cmd, \undef, \$output); 

# Option 3: 
my $output = system("program"); 

# Option 4: 
my $output = `program`; 

# Option 5: 
my $output = exec("program"); 

並沒有以上的似乎捕捉到有問題的程序的確切字符串輸出。

我只是想知道是否有比我以前列出的更好的方法。

編輯:

這是Windows系統

+2

確保您的程序不輸出爲標準錯誤。 – 2014-10-02 17:53:29

+1

使用反引號或'qx()'來捕獲標準輸出的輸出。 'system'只給你程序的退出狀態,'exec'結束你的Perl程序,根本不能返回任何東西。如果你沒有得到反引號的捕獲,那是因爲沒有人被髮送。 – TLP 2014-10-02 18:03:10

回答

2

使用選項1,但增加2>&1到這樣的:

open(FH, "program -paramaeters 2>&1 |") or warn("$!"); 
while (my $line = <FH>) { print $line } 

,將捕獲的程序作爲意志的stderr輸出作爲stdout。

+0

我應該添加這是爲Windows系統。這有什麼區別嗎? – falconspy 2014-10-02 18:06:57

+0

它看起來應該按照這個工作:http://support.microsoft.com/kb/110930 – Alcanzar 2014-10-02 18:08:26

0

根據您自己的選擇可能的解決方案。

1 :(禮貌Alcanzar,改進使用詞彙變數)將檢索STDOUT & STDERR合併在一起,逐行閱讀。

open(my $FH, "program -paramaeters 2>&1 |") or warn("$!"); 
while (my $line = <$FH>) { print $line } 

2a:檢索STDOUT & STDERR作爲獨立字符串。

run3(\@cmd, \undef, \$output, \$error); 

2B:檢索經由IO ::管道對象STDOUT & STDERR作爲獨立流稍後讀取,或許線由行。

run3(\@cmd, \undef, $output, $error); 

3:system()返回退出代碼,而不是輸出。 不是你想要的

4:很像選項#1。輸出被合併成一個字符串。

my $output = `program 2>&1`; 

5:exec():終止該程序並運行指定的程序。退出狀態將返回到此程序的父... 不是你想要的


如果子程序長時間運行,或者它的輸出非常大,您可能想要避免使用解決方案#4(反引號)或替換解決方案#2(IPC :: Run3)中的標量引用與 IO::Pipe對象。

相關問題