如何将标量值(字符串)添加到 Perl 中的现有散列
How to add a scalar value (string) to an existing hash in Perl
我只想知道将一个值合并到一个散列中的过程是什么。
我有一个散列,它有 5 到 6 个键,具体取决于错误是否输出运行时值。接受参数的方法也首先接受错误消息字符串。我希望它能够将这个错误消息字符串添加到散列中,基本上形成一个大散列。
方法调用方式如下:
ASC::Builder::Error->new("Simple error message here", code => "UNABLE_TO_PING_SWITCH_ERROR", switch_ip => $ip3, timeout => $t1);
最后两个值将运行时 parameters/values 分配给错误哈希中上下文键内的键。
查看错误散列:
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 上看到的一个例子的尝试,下面是 link:
http://www.perlmonks.org/?node_id=14263
我将从如何在 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
键,如果有重复项,第二组中出现的任何值都将是 'wins'.
老实说,我不知道第二个函数在做什么,因为它引用的变量实际上并不存在于每一行中。 (创建一个也这样做,但只在几行上)。
根据你的描述,我认为你只想添加一个键,所以你并不需要这样做,你应该能够只将键添加到原始对象:$error->{messsage} = $message
但假设您确实想传递两个散列引用并合并它们,它看起来像这样:
sub merge {
my ($first, $second) = @_;
my %merged = (%$first, %$second);
return bless \%merged, $class;
}
我只想知道将一个值合并到一个散列中的过程是什么。 我有一个散列,它有 5 到 6 个键,具体取决于错误是否输出运行时值。接受参数的方法也首先接受错误消息字符串。我希望它能够将这个错误消息字符串添加到散列中,基本上形成一个大散列。
方法调用方式如下:
ASC::Builder::Error->new("Simple error message here", code => "UNABLE_TO_PING_SWITCH_ERROR", switch_ip => $ip3, timeout => $t1);
最后两个值将运行时 parameters/values 分配给错误哈希中上下文键内的键。
查看错误散列:
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 上看到的一个例子的尝试,下面是 link: http://www.perlmonks.org/?node_id=14263
我将从如何在 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
键,如果有重复项,第二组中出现的任何值都将是 'wins'.
老实说,我不知道第二个函数在做什么,因为它引用的变量实际上并不存在于每一行中。 (创建一个也这样做,但只在几行上)。
根据你的描述,我认为你只想添加一个键,所以你并不需要这样做,你应该能够只将键添加到原始对象:$error->{messsage} = $message
但假设您确实想传递两个散列引用并合并它们,它看起来像这样:
sub merge {
my ($first, $second) = @_;
my %merged = (%$first, %$second);
return bless \%merged, $class;
}