假设有一系列哈希如图所示:
@test = (
{
VAR1 => "1",
VAR2 => "2",
VAR3 => "3",
},
{
VAR1 => "11",
VAR2 => "22",
VAR3 => "33",
},
{
VAR1 => "111",
VAR2 => "222",
VAR3 => "333",
},
);
一个数组:
@test2 = ("4,44,444");
如何将数组作为哈希数组中的键值对添加?
拍摄最终结果,如下所示:
@result = (
{
VAR1 => "1",
VAR2 => "2",
VAR3 => "3",
VAR4 => "4",
},
{
VAR1 => "11",
VAR2 => "22",
VAR3 => "33",
VAR4 => "44",
},
{
VAR1 => "111",
VAR2 => "222",
VAR3 => "333",
VAR4 => "444",
},
);
我是perl的新手,并不确定如何实现这一目标。提前谢谢。
答案 0 :(得分:3)
首先,为什么@test2
是一个数组,如果它包含的是一个字符串???要解决此问题,您可以使用以下内容:
my @real_test2 = split(/,/, $test2[0]);
为什么使用哈希作为数组????使用AoA!如果你有AoA,那就是
for my $i (0..$#result) {
push @{ $result[$i] }, $real_test2[$i];
}
如果你想坚持使用AoH,它就非常相似。
for my $i (0..$#result) {
my $rec = $result[$i];
my $key = 'VAR' . ( keys(%$rec) + 1 );
$rec->{$key} = $real_test2[$i];
}
或者,如果您知道密钥总是相同的,那么您可以稍微优化一下。
if (@result) {
my $key = 'VAR' . ( keys(%{ $result[0] }) + 1 );
for my $rec (@result) {
$rec->{$key} = shift(@real_test2);
}
}
答案 1 :(得分:1)
如果真的想要坚持使用哈希数组,那么这对您有用。
for
循环遍历@test
和@test2
的所有索引。我使用了List::Util
中的min
函数来查找两个数组中较短者的最后一个索引。这样可以避免一个或另一个阵列的末端脱落,以防它们的长度不同。
通过使用正则表达式从max
中提取每个键的数字部分以及List::Util
函数,可以找到编号最大的哈希键。要使用的下一个键是超过此最大值的一个,前面是字符串VAR
。
我仅使用Data::Dump
来显示结果数据结构。
use strict;
use warnings;
use List::Util qw/ min max /;
my @test = (
{ VAR1 => 1, VAR2 => 2, VAR3 => 3 },
{ VAR1 => 11, VAR2 => 22, VAR3 => 33 },
{ VAR1 => 111, VAR2 => 222, VAR3 => 333 },
);
my @test2 = (4, 44, 444);
my $limit = min $#test, $#test2;
for my $i (0 .. $limit) {
my $max = max map /(\d+)/, keys %{ $test[$i] };
$test[$i]{'VAR'.++$max} = $test2[$i];
}
use Data::Dump;
dd \@test;
<强>输出强>
[
{ VAR1 => 1, VAR2 => 2, VAR3 => 3, VAR4 => 4 },
{ VAR1 => 11, VAR2 => 22, VAR3 => 33, VAR4 => 44 },
{ VAR1 => 111, VAR2 => 222, VAR3 => 333, VAR4 => 444 },
]
但是如果你想要一个数组数组,那么它看起来会更像这样。它非常相似,只是我可以使用push
而不是为数组的下一个元素计算索引。
use strict;
use warnings;
use List::Util qw/ min /;
my @test = (
[ 1, 2, 3 ],
[ 11, 22, 33 ],
[ 111, 222, 333 ],
);
my @test2 = (4, 44, 444);
my $limit = min $#test, $#test2;
for my $i (0 .. $limit) {
push @{ $test[$i] }, $test2[$i];
}
use Data::Dump;
dd \@test;
<强>输出强>
[[1 .. 4], [11, 22, 33, 44], [111, 222, 333, 444]]
答案 2 :(得分:0)
$test[$_]{VAR4} = $test2[$_] foreach 0..$#test2;
我不得不同意ikegami对哈希的使用非常糟糕。
散列的关键不应该数字 order 的重要或重要。它应该 mnemonically 重要。它应该告诉你 4是什么。