Perl - 数组中的匿名哈希

时间:2014-03-01 16:28:50

标签: arrays perl hash

我正在尝试在匿名数组中添加多个键值引用。这是我目前正在使用的代码:

my %hash;
my $count = 25;
foreach my $var1 ('a'..'e'){
    $hash{'value'} = [
                      'one',
                      'two',
                      {
                            'consensus' => {$var1 => $count},
                            'glimmer'   => {'test' => 'me'},
                      }
                    ];
    $count -= 5;
    print "INITIAL-$var1: ", $hash{'value'}->[2]{'consensus'}{$var1}, "\n";
}

foreach my $var1 ('a'..'e'){
    print "FINAL-$var1: ", $hash{'value'}->[2]{'consensus'}{$var1}, "\n";
}

print Dumper(%hash);

然而,发生的是每次$ var1和$ count更改时,它会覆盖$ var1 =>的前一个实例。 $计数。我想知道是否有办法为这个数据结构添加新的键值对(而不是在开始时声明它

$hash{'value'}{'consensus'} = ...

编辑:对不起,我现在得到:

$VAR2 = [
          'one',
          'two',
          {
            'glimmer' => {
                           'test' => 'me'
                         },
            'consensus' => {
                             'e' => 5
                           }
          }
        ];

然而,我正在寻求:

$VAR2 = [
          'one',
          'two',
          {
            'glimmer' => {
                           'test' => 'me'
                         },
            'consensus' => {
                             'a' => 25
                             'b' => 20
                             'c' => 15
                             'd' => 10
                             'e' => 5
                           }
          }
        ];

4 个答案:

答案 0 :(得分:2)

或者简单地说:

$count = 25;
$x = 5;
$hash{'value'} = [
                  'one',
                  'two',
                  {
                        'consensus' => {map {$_, $count - (5*$x--)} ('a' .. 'e')},
                        'glimmer'   => {'test' => 'me'},
                  }
                ];

答案 1 :(得分:1)

您只想做一次的部分不应该在循环中!

您想要的结果中有一个数组,但您在代码中创建了五个数组。数组创建不应该在循环中。

在您想要的结果中,数组中有一个哈希,但您在代码中创建了五个哈希。哈希创建不应该在循环内。

您想要的结果中有两个三级哈希,但您在代码中创建了十个。哈希创建不应该在循环内。

my %hash = (
    value => [
        'one',
        'two',
        {
            'consensus' => { },
            'glimmer'   => { test => 'me' },
        },
    ],
);

my $count = 25;
for my $i ('a'..'e') {
    $hash{value}[2]{consensus}{$i} = $count;
    $count -= 5;
}

答案 2 :(得分:0)

你能试试吗

push @{$hash{'value'}}, 'one', 'two'
foreach my $var1 ('a'..'e'){
    push @{$hash{'value'}}, {'consensus' => {$var1 => $count}};
    $count -= 5;
    print "INITIAL-$var1: ", $hash{'value'}->[2]{'consensus'}{$var1}, "\n";
}

答案 3 :(得分:0)

问题是你每次都要分配一个新的匿名数组ref,它会覆盖旧的一个:

$hash{'value'} = [ .... # old value is overwritten

您需要的是直接将分配直接用于散列键/值。

$hash{'value'}->[2]{'consensus'}{$var1} = $count;

您还可以生成散列引用并直接分配它,例如:

my $href;
for my $letter ('a'..'e') {
    $href->{$letter} = $count;
    $count -= 5;
}
$hash{'value'}->[2]{'consensus'} = $href;