2009-07-01 31 views
1

システムコールによって実行されるシェルエラーを検出する基本エラーチェックシステムをセットアップしようとしています。 execute_commandは、システムコールを実行してエラーメッセージを4番目のパラメータに設定するwebmin関数です。私は基本的に呼び出すexecute_command_error私はすでに私の事前に定義された配列に作成され、ベースのユーザーと呼ばれるテストを持っていることを知っている(「adduserのテスト」)、idはそれを印刷することを期待整数と文字列を使用した多次元配列

追加することができませんでしたユーザ
を追加できません

そのユーザーは既に がシステムに存在するためです。

しかし、代わりに私が手:

Uhhhhhhhhh?
よろしいですか?

私は$ exeと$ returnが "adduser"と1、respectfullyであることを確認しました。 配列について理解していないのは何ですか?それは文字列と数字を無視して、3つの要素で最後の定義を行っているようです。これに対する解決策、またはより良い解決策は何ですか?

$ErrorMsg['adduser',1,'title'] = "Unable to add user"; 
$ErrorMsg['adduser',1,'msg'] = "Unable to add that user because it already exists on the system."; 
$ErrorMsg['random',2,'duaisdhai'] = "Uhhhhhhhhh?"; 

sub execute_command_error 
{ 
    my $error = ""; 
    my $cmd = $_[0]; 

    $return = execute_command($cmd, undef, undef, \$error)>>8; 
    if ($error) { 
     my ($exe) = $cmd =~ m|^(.*?)[ ]|; 

     $exe_title = $ErrorMsg[$exe,$return,'title']; 
     $exe_msg = $ErrorMsg[$exe,$return,'msg']; 


     print $exe_title."<br>"; 
     print $exe_msg ."<br>"; 
    } 
} 

アップデート:ここで

がTHSコードです

私はハッシュを使用する必要があることを考えています、私はインデックス内の文字列を使用することができると思った理由はわかりません。それで、ほとんど研究が私にこのような何かをもたらしました:

%ErrorMsgs = ('adduser' => { 
       '1' => { 
        'title' => 'Unable to add user', 
        'msg' => 'Unable to add that user because it already exists on the system.', 
       }, 
      }, 
      ); 

ここで変数を使ってどのように参照しますか?これらの作業のいずれので:

$exe_title = $ErrorMsgs{"$exe"}{"$return"}{"title"}; 
    $exe_title = $ErrorMsgs{$exe}{$return}{title}; 

答えて

2

まず、多次元構造を行うための適切な構文のためperldscを参照してください。あなたの配列は意味をなさない。

warningsがオンになっていると、配列インデックスで意味のある方法で文字列を使用できないことを示す「引数は数値ではありません」という警告が表示されます。

ただし、アップデートに投稿したハッシュはうまくいくはずです。

#!/usr/bin/perl 

use strict; 
use warnings; 
## ^^ these things are your friends 

my %ErrorMsgs = ('adduser' => { 
         '1' => { 
           'title' =>  'Unable to add user', 
           'msg' =>  'Unable to add that user because it already exists on the system.', 
         }, 
       }, 
       ); 

my $exe = 'adduser'; 
my $return = 1; 

print $ErrorMsgs{$exe}{$return}{title}; # works 

あなたが期待する出力を取得していない場合は$exeまたは$returnに何か問題がありますので、それはだ - 彼らはあなたがそれらを使用しようとしているスコープで定義されていない可能性がありますが。 strictと警告をオンにすると、問題を追跡するのに役立ちます。

1

{'key' => 'val'}はハッシュリファレンスを作成するので、キーを検索する前に逆参照します。

$ exeまたは$ returnは、すでに文字列を保持しているので、引用する必要もありません。

Perlは多次元インデックスをサポートしていないことに注意してください。多次元配列は、配列の配列だけであるので、あなたは、各インデックスの[]を使用する必要があります。スカラコンテキストでは、コンマ演算子は右端の式の値を返すので、次の行は等価である:

$ErrorMsg[0,1,2] = "foo"; 
$ErrorMsg[2] = "foo"; 

注リストコンテキストでは、コンマ演算子は私たちのスライスを与える、値のリストを返すこと:

@a=qw(f o o); 
@a[3,4,5] = qw(b a r); 
print join(',', @a), "\n"; 
# output: f,o,o,b,a,r 
@ErrMsg{qw(title msg)} = ('Unable to add user', 'Unable to add that user because it already exists on the system.')