2016-06-29 2 views
0

값을 해시에 병합하는 과정을 알고 싶습니다. 오류가 런타임 값을 출력하는지에 따라 5 ~ 6 개의 키가있는 해시가 있습니다. 인수를 취하는 메소드는 또한 처음에는 오류 메시지 문자열을 사용합니다. 기본적으로 하나의 큰 해시를 만들기 위해이 오류 메시지 문자열을 해시에 추가 할 수 있기를 원합니다.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', 
    } 
}; 
메시지

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; 
} 
를 오류 해시 조작 및 구성하는 내 방법

_create_hash의 출력은이어야 _merge_hashes 입력 올바르게 처리했는지 확실하지 않습니다. 이 메소드는 새 메소드 (현재는 엉망입니다) 내부에서 사용되므로 포함되지 않습니다. 그것은 아주 간단 나는 펄에서 해시를 병합하는 방법에 대한 간단한 설명과 함께 시작하는거야 http://www.perlmonks.org/?node_id=14263

+0

단지주의해야 할 점은 생성자가 올바른 객체를 반환하기를 원한다는 것을 기억하십시오. 따라서 'new' 메소드는 반환해야합니다. 'bless'-ed ref를 사용하여 호출 코드가 제대로 작동하도록합니다. 보통'return bless $ self, $ class'를 할 것은'new'입니다. 그 방법의 내부에서, 그래서 클래스 안에서, 당신은 물론 다른 서브를 호출하여 작업을 구성 할 수 있습니다. – zdim

답변

1

: 그냥 시도가 나는 perlmonks에서 본 예에,이다

, 여기에 링크입니다 .

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 } 

당신이 '승리'는 하나가 될 것입니다 두 번째 세트에 나타납니다 어떤 값 중복이있는 경우 a 키를 알게 될 것이다.

실제로 두 번째 함수가 실제로 모든 행에 존재하지 않는 변수를 참조하기 때문에 무엇을하는지 알지 못합니다. (작성자도이 작업을 수행하지만 몇 줄에 대해서만 수행합니다.) $error->{messsage} = $message

하지만 가정 : 당신의 설명에서

당신은 당신이 정말로하지만, 당신은 단지 원래의 객체에 키를 추가 할 수 있어야 할 필요가 없습니다 하나의 키를 추가하고 싶지는 생각

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

예 저는 단 하나의 키만 원합니다. 참조를 사용하려고 생각한 것은 해쉬가 이미 new() 메서드에서 만들어져 이들 모두를 사용한다는 것입니다. 이것은 더 나은 이해를주었습니다. 하나의 출력을 다른 출력으로 전달할 때 나는 확신하지 못했습니다.'$ first_param'은 코드가 제거 된 후에''UNABLE_TO_PING SWITCH_ERROR ''가 될 출력을 축복해야만합니다. –

+0

모든 축복은 메서드 조회에 사용하기 위해 패키지 이름을 주어진 참조와 연결하므로 일반적으로 최상위 수준 개체에만 적용됩니다. –

+0

그리고 오류 메시지를 값의 키로 쓰고 싶다면'$ error -> {$ message} = $ hashRef' –

관련 문제