我有一个数组。数组中的元素在它们之间包含半冒号。
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中的哪个数据结构可用于实现上述目的?
请帮助..
答案 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;