如何将标量值(字符串)添加到Perl中的现有哈希

时间:2016-06-29 14:42:10

标签: perl hash merge hash-of-hashes

我只想知道将值合并到哈希中的过程是什么。 我有一个哈希,它有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

1 个答案:

答案 0 :(得分: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;
}