Хобрук: Ваш путь к мастерству в программировании

Как добавить скалярное значение (строку) к существующему хешу в Perl

Я просто хочу знать, какой процесс стоит за объединением значения с хэшем. У меня есть хеш, который имеет от 5 до 6 ключей в зависимости от того, выводит ли ошибка значения времени выполнения. Метод, который принимает аргументы, также сначала принимает строку сообщения об ошибке. Я хочу, чтобы он мог добавить эту строку сообщения об ошибке в хэш, чтобы в основном сделать один большой хэш.

Вот как метод будет называться:

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 Не уверен, правильно ли я обработал это. Эти методы будут использоваться внутри нового метода (который сейчас беспорядок), поэтому он не включен.

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


  • Просто примечание: помните, что вы хотите, чтобы конструктор возвращал надлежащий объект, поэтому метод new должен возвращать bless-ed ref, чтобы вызывающий код имел подходящую вещь для работы. Обычно new делает return bless $self, $class. Внутри этого метода, то есть внутри класса, вы, конечно, можете вызывать другие подпрограммы для организации работы. 29.06.2016

Ответы:


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;
}
29.06.2016
  • да, мне нужен только один ключ, я думал об использовании ссылок, так как хэши уже созданы в методе new(), который использует оба из них. Это дало мне лучшее понимание, я просто не уверен, что при передаче вывода одного в другое, должен ли я благословлять выходы $first_param "UNABLE_TO_PING SWITCH_ERROR" после удаления кода. 29.06.2016
  • Все, что делает благословение, — это связывает имя пакета с заданной ссылкой для использования в поиске метода, поэтому обычно вы просто имеете его на объекте верхнего уровня. 29.06.2016
  • И если вы сказали, что хотите, чтобы сообщение об ошибке было ключом значения, вы можете сделать это $error->{$message} = $hashRef 29.06.2016
  • Новые материалы

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..

    Раскрытие возможностей НЛП: часть речевой маркировки и ее проблемы
    В сфере обработки естественного языка (NLP) маркировка частей речи (POS) выступает в качестве фундаментального метода, позволяющего компьютерам понимать и анализировать человеческий язык на..

    Под поверхностью: раскрытие деталей системы с помощью инструментов Linux CLI
    Чем больше вы изучаете Linux и продвигаетесь вперед, тем больше вам нужно проверять информацию о вашей системе. Эта информация может касаться аппаратного обеспечения, такого как процессор,..