2011-09-20 135 views
0

我目前正在修改一個執行多個shell命令的Perl腳本,並且對於其中的一些命令,捕獲輸出以供進一步處理。我想分解在子例程中執行外部命令的代碼。我寫了下面的子程序:從子線程執行外部命令(並讀取其輸出)

sub execute_command { 
    my $cmd = shift; 

    Log("executing command $cmd ..."); 
    system($cmd); 
    my $app = ($? == -1) ? $? : $? >> 8; 
    if ($app != 0) { 
    Log("error executing command $cmd"); 
    return $FAILURE; 
    } 
    Log("done"); 
    return $SUCCESS; 
} 

sub execute_command_and_get_output { 
    my $cmd = shift; 

    Log("executing command $cmd ..."); 
    unless (open(CMD, "$cmd|")) { 
    Log("error executing command $cmd"); 
    return undef; 
    } 
    my @cmd = <CMD>; 
    close(CMD); 
    Log("done"); 
    return @cmd;  
} 

問題:

  1. execute_command應該在錯誤的情況下執行該命令傳遞和返回$SUCCESS如果一切正常,或$FAILURE。我是否正確測試$?

  2. execute_command_and_get_output應執行傳遞的命令並將輸出作爲數組返回(包含輸出行);如果命令的執行失敗,則應返回undef。使用unless (open(CMD, "$cmd|")) { ... }來測試命令執行中的錯誤條件是否正確?

除了我的兩個問題的答案,任何改善建議表示讚賞。

回答

1

1)如果你不關心發生了什麼錯誤,就足以檢查system返回值:

if(system($cmd) == 0) { return $SUCCESS } else { return $FAILURE } 

2)替代return undef,它通常是最好只return。它在列表環境中調用時效果更好(它仍然是false)。如果回報很大,則可能需要返回引用以避免複製。

1
  • execute_command_and_get_output可以返回兩個參數:

    1. $SUCCESS$FAILURE
    2. 的引用數組,要麼具有結果或空
  • execute_command也可以返回兩個參數:

    1. $SUCCESS$FAILURE
    2. 錯誤消息。例如:

      system ($cmd) == 0 or return ($FAILURE,"error executing command $cmd: $!"); 
      return ($SUCCESS, "done"); 
      
  • 順便說一句,你能避免通過CMD部分使用反引號去(而且,在多個上下文中使用相同的名稱是混亂)。

    my @lines = `$cmd`; 
        ($? == 0) or return ($FAILURE,"error executing command $cmd: $!"); 
        return ($SUCCESS, \@lines); 
    
+0

感謝您的回答:我很欣賞的想法,但是我更喜歡從'execute_command_and_get_output'返回多個值,我也不行多使用反引號的。 – MarcoS

相關問題