2012-10-24 83 views
1

我有一個數組。數組中的元素在它們之間包含分號。將元素插入到哈希散列中perl

陣列看起來是這樣的:

@Array = { "AUT;E;1", 
      "AUT;E;2", 
      "CHE;A;1", 
      "CHE;C;4" 
     }; 

我想分割使用數組元素「;」 (分號)作爲分隔符。

通過使用散列欲存儲「AUT」作爲鍵,並根據該散列要存儲E => 1和E => 2.

即我所需要的散列作爲

%HashOfElem = (
     'AUT' => { 
        'E' => 1, 
        'E' => 2 
        }, 

     'CHE' => { 
        'A' => 1, 
        'C' => 4 
        } 
      ) 

爲此我寫了下面的代碼如預期:(

foreach(@Array) 
{ 
    my @TmpArray = split(/;/,$_); 

    %HashOfElem = (
       $TmpArray[0] => { 
            $TmpArray[1] => $TmpArray[2] 
           } 
       ); 

}未表現

如果我的方法錯了,那麼perl中的哪個數據結構可以用來達到上述目的?

請幫助..

+7

鍵在散列中是唯一的。 – Toto

+1

'E => 1和E => 2',兩者不能在同一個散列中。 –

+0

好的。那麼perl中的哪個數據結構可以用來達到上述目的? –

回答

7

需要注意的是你做錯了assignement到@array,它應該是(括號,而不是大括號):

根據最新評論:

my @array = (
    "AUT;E;1", 
    "AUT;E;2", 
    "CHE;A;1", 
    "CHE;C;4" 
); 

所以你的腳本變成:

my @array = (
    "AUT;E;1", 
    "AUT;E;2", 
    "AUT;E;2", 
    "CHE;A;1", 
    "CHE;C;4" 
); 
my %hash; 
my %dups; 
foreach (@array) { 
    next if exists $dups{$_}; # skip this line if already stored 
    $dups{$_} = 1; 
    my @tmp = split/;/; 
    push @{$hash{$tmp[0]}{$tmp[1]}}, $tmp[2]; 
} 
say Dumper\%hash; 

輸出:

$VAR1 = { 
      'CHE' => { 
        'A' => [ 
           '1' 
          ], 
        'C' => [ 
           '4' 
          ] 
        }, 
      'AUT' => { 
        'E' => [ 
           '1', 
           '2' 
          ] 
        } 
     }; 
+0

謝謝。我不知道有關「哈希」的「推」。再次感謝。 –

+0

@SSHegde:不客氣。 – Toto

+2

@SSHegde,請注意'push'正在處理數組。 '@ {...}'使得哈希引用的每個元素成爲一個數組。 – dan1111

2

如前所述,哈希鍵必須是唯一的。一種方法是讓每個內部散列鍵指向該鍵的一組值:

use strict; 
use warnings; 

my @Array = ( 
    "AUT;E;1", 
    "AUT;E;2", 
    "CHE;A;1", 
    "CHE;C;4" 
); 
my %HashOfElem; 

foreach(@Array) 
{ 
    my @TmpArray = split(';',$_); 
    print "@TmpArray\n"; 

    push @{$HashOfElem{$TmpArray[0]}{$TmpArray[1]}}, $TmpArray[2]; 
} 

#show variable. 
use Data::Dumper; 
print Dumper %HashOfElem; 
+1

感謝您的回答。 :) –

+0

我很樂意幫助...即使我在這種情況下幾分鐘太慢:) – dan1111