将元素插入perl中哈希的哈希值

时间:2012-10-24 11:33:55

标签: perl perl-data-structures

我有一个数组。数组中的元素在它们之间包含半冒号。

Array看起来像这样:

@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中的哪个数据结构可用于实现上述目的?

请帮助..

2 个答案:

答案 0 :(得分:7)

请注意,你对@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'
                            ]
                   }
        };

答案 1 :(得分: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;