2012-10-24 39 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