将另一个键添加到数组中的哈希数组?

时间:2015-02-02 18:36:56

标签: arrays perl hash perl-data-structures

假设有一系列哈希如图所示:

@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的新手,并不确定如何实现这一目标。提前谢谢。

3 个答案:

答案 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是什么