2011-09-20 8 views
0

現在、いくつかのシェルコマンドを実行するPerlスクリプトを変更しています。私はサブルーチンで外部コマンドを実行するコードを除外したい。エラーの場合に$FAILUREを渡されたコマンドを実行し、すべてがOKであれば$SUCCESSを返す、または必要がありますサブルーチンから外部コマンドを実行して(その出力を読み取る)

  1. execute_command

    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;  
    } 
    

    質問:私は、次のサブルーチンを書きました。正しい方法で$?をテストしていますか?

  2. は、渡されたコマンドを実行し、出力を配列(出力行を含む)として返す必要があります。コマンドの実行に失敗した場合は、undefを返します。コマンド実行のエラー状態をテストするのに、unless (open(CMD, "$cmd|")) { ... }を使用するのは正しいですか?

私の2つの質問に対する回答に加えて、改善のための提案は高く評価されます。

答えて

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も返すことができる2つの引数:

    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

関連する問題