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

SS *_*gde 1 perl perl-data-structures

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

数组看起来像这样:

@Array = { "AUT;E;1",
           "AUT;E;2",
           "CHE;A;1",
           "CHE;C;4"
         };
Run Code Online (Sandbox Code Playgroud)

我想用';'分割数组元素 (分号)作为分隔符.

通过使用散列哈希,我想将'AUT'存储为键,并且希望存储E => 1且E => 2.

即我需要哈希作为

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

         'CHE' => {
                     'A' => 1,
                     'C' => 4
                  }
              )
Run Code Online (Sandbox Code Playgroud)

为此,我编写了以下代码,其行为不符合预期:(

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

    %HashOfElem = (
              $TmpArray[0] => {
                                  $TmpArray[1] => $TmpArray[2]
                              }
                  );
Run Code Online (Sandbox Code Playgroud)

}

如果我的方法是错误的,那么perl中的哪个数据结构可用于实现上述目的?

请帮忙..

Tot*_*oto 7

请注意,你对@Array做错了,它应该是(括号而不是括号):

根据评论更新:

my @array = (
    "AUT;E;1",
    "AUT;E;2",
    "CHE;A;1",
    "CHE;C;4"
);
Run Code Online (Sandbox Code Playgroud)

所以你的脚本变成:

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;
Run Code Online (Sandbox Code Playgroud)

输出:

$VAR1 = {
          'CHE' => {
                     'A' => [
                              '1'
                            ],
                     'C' => [
                              '4'
                            ]
                   },
          'AUT' => {
                     'E' => [
                              '1',
                              '2'
                            ]
                   }
        };
Run Code Online (Sandbox Code Playgroud)

  • @SSHegde,请注意`push`正在处理数组.`@ {...}`使散列引用的每个元素都成为一个数组. (2认同)