2016-06-29 4 views
0

値をハッシュにマージすることの背後にあるプロセスを知りたいだけです。 エラーが実行時の値を出力するかどうかによって、5〜6個のキーを持つハッシュがあります。引数を取り込むメソッドも、最初にエラーメッセージ文字列を取ります。私はそれが基本的に1つの大きなハッシュを作るために、このエラーメッセージ文字列をハッシュに追加できるようにしたい。Perl内の既存のハッシュにスカラー値(文字列)を追加する方法

ASC::Builder::Error->new("Simple error message here", code => "UNABLE_TO_PING_SWITCH_ERROR", switch_ip => $ip3, timeout => $t1); 
  • 最後の二つの値がエラーハッシュのコンテキストキー内部のキーに、ランタイム・パラメータ/値を割り当てます。

    これは、メソッドが呼び出されます方法です。ここで

  • はエラーハッシュを見ている:ここでは

    use constant ERROR_CODE => { 
        UNABLE_TO_PING_SWITCH_ERROR => { 
         category => 'Connection Error', 
         template => 'Could not ping switch %s in %s seconds.', 
         context => [qw(switch_ip timeout)], 
         tt => {template => 'disabled'}, 
         fatal => 1, 
         wiki_page => 'www.error-solution.com/ERROR_CODE_A', 
        } 
    }; 
    

_create_hashの出力があるべきエラーハッシュを操作し、メッセージ

sub _create_error_hash { 
    my $error_string = shift;                                        if(defined($params{code}) {      
    my $first_param = delete $params{code};                                        
     foreach my $key (@{$first_param->{context}}) {                                      
      $first_param->{$key} = $key;                                         
     }                                                 
     my @template_args = map { $first_param->{$_}} @{$first_param->{context} };                               
     $first_param->{message} = sprintf($first_param->{template}, @template_args);                 }              
     return bless $first_param;                                           
    } 

sub _merge_hashes { 
    my ($message = {message => $messsage}, $first_param = {first_param => $first_param}) = @ _; 
    #merge these two hashes and bless into $class (don't know how to merge hashes) 
    my %merged_hash = ($message, $first_param); 
    return bless $merged_hash, $class; 
} 

を構築するための私の方法であり、 _merge_hashesの入力 これを正しく処理したかどうかわかりません。これらのメソッドは新しいメソッドの中で使用されます(これは今や混乱です)。なぜそれが含まれていないのですか?私はperlmonksで見られる例のちょうど試み、だ

は、ここにリンクされています、それはかなり簡単な http://www.perlmonks.org/?node_id=14263

+0

ちょうど注意してください - コンストラクタが適切なオブジェクトを返すようにして、 'new'メソッドが返されるようにしておいてください'bless'-ed refを使用して、呼び出しコードに適切な作業ができるようにします。通常、 'return bless $ self、$ class'を行うのは' new'です。そのメソッドの中で、クラスの中で、あなたはもちろん、他のsubsを呼び出して仕事を整理することができます。 – zdim

答えて

1

私はperlでハッシュをマージする方法の簡単な説明を開始するつもりだです。

use strict; 
use warnings; 

use Data::Printer; 

my (%a, %b, %c); 

%a = (a => 1, b => 2); 
%b = (a => 0, c => 3, d => 4); 
%c = (%a, %b); 

p(%c); # { a => 0, b => 2, c => 3, d => 4 } 

あなたはその「勝利」1になります第二セットに表示されますどのような値に重複がある場合aキーで注意しましょう。

実際にすべての行に存在しない変数を参照するため、2番目の関数が何をしているのか正直なところはわかりません。 (作成者もこれを行いますが、数行だけで行います)。 $error->{messsage} = $message

しかし、あなたを想定して:あなたの説明から

私はあなただけあなたが本当にかかわらず、あなただけのオリジナルのオブジェクトにキーを追加することができなければならないことする必要はありませんので、単一のキーを追加したいと思います

sub merge { 
    my ($first, $second) = @_; 
    my %merged = (%$first, %$second); 
    return bless \%merged, $class; 
} 
+0

ええ私は1つのキーだけを必要としています。リファレンスを使う考えは、ハッシュがすでにnew()メソッドで作成されていて、両方を消費するということでした。これは私にはより良い理解を与えてくれました。私は出力を渡すときに確信していません。 '$ first_param'の出力は' 'UNABLE_TO_PING SWITCH_ERROR' 'を意味します。 –

+0

すべての祝福は、メソッドルックアップで使用するためにパッケージ名を特定の参照に関連付けているため、通常はトップレベルオブジェクトに置くだけです。 –

+0

あなたがエラーメッセージを値のキーにしたいと言っているなら、あなたは '$ error - > {$ message} = $ hashRef' –

関連する問題