2016-06-29 3 views
0

Я просто хочу знать, что происходит за слиянием значения в хэш. У меня есть хеш, который имеет от 5 до 6 ключей в зависимости от того, выводит ли ошибка значения времени выполнения. Метод, который принимает аргументы, также принимает строку с сообщением об ошибке. Я хочу, чтобы он мог добавить эту строку сообщения об ошибке в хэш, чтобы сделать один большой хеш в основном.Как добавить скалярное значение (string) к существующему хешу в 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 должен быть input for _merge_hashes Не уверен, что я правильно это обработал. Эти методы будут использоваться внутри нового метода (сейчас это беспорядок), поэтому он не включен.

Это просто попытка примера я видел на perlmonks, вот ссылка: http://www.perlmonks.org/?node_id=14263

+0

Просто обратите внимание - помните, что вы хотите, чтобы конструктор вернуть правильный объект, поэтому 'new' метод должен возвращать «благословение», чтобы код вызова имел правильную работу. Обычно это 'new', который будет делать' return bless $ self, $ class'. Внутри этого метода, поэтому внутри класса, вы можете, конечно, называть другие подсистемы для организации работы. – 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 } 

Вы отметите с 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' –