我正在尝试在匿名数组中添加多个键值引用。这是我目前正在使用的代码:
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
}
}
];
答案 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;