1

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

数组看起来像这样:

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

请帮忙..

4

2 回答 2

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'
                            ]
                   }
        };
于 2012-10-24T11:40:28.207 回答
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;
于 2012-10-24T11:44:54.443 回答