2014-03-01 67 views
0

我試圖在匿名數組中添加多個鍵值引用。這是我目前使用的代碼:Perl - 數組中的匿名哈希

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和$計數的變化,它將覆蓋的$ 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

好,什麼是在最後你真正想要的數據結構?當我們知道你要去的地方時,告訴你方式會更容易。 – amon

回答

2

或者乾脆:

$count = 25; 
$x = 5; 
$hash{'value'} = [ 
        'one', 
        'two', 
        { 
         'consensus' => {map {$_, $count - (5*$x--)} ('a' .. 'e')}, 
         'glimmer' => {'test' => 'me'}, 
        } 
       ]; 
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"; 
} 
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; 
} 
0

的問題是,你分配一個新的匿名數組每次裁判,它會覆蓋舊的:

$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;