我不确定我是否在这里使用正确的术语,但我正在尝试通过数组循环并创建数组和值的哈希。
目前我的代码是这样的:
my $endResult;
my $list = $arrayRef;
my $hash;
foreach my $hash_ref ( @$list ) {
if ( substr($hash_ref->{ID_NUMBER}, 0, 3) eq 'ABC' ) {
$hash->{'ABC'}{$hash_ref->{ID_NUMBER}}->{'VEHICLES'} = $arrayRef1;
push(@$endResult, $hash);
}
... #more ID number if statementss with different id numbers
得到如下输出:
[
{
ABC => {
ABC1234 => {
VEHICLES => [
{ X => 11, Y => 0, Z => 12 },
{ X => 2001, Y => 100000, Z => 300 },
],
},
ABC56778 => {
VEHICLES => [
{ X => 1324, Y => 0, Z => 234 },
{ X => 666, Y => 7777, Z => 555 },
],
},
...
但是我想要的是ABC
指向哈希数组(ABC1234
, ABC46778
),而不是它是怎样的。让我知道,如果我需要澄清更好,但我不能找出正确的语法,使这种情况发生时,构建我的哈希。
要将长键放入单独的数组ref中,需要更改数据结构的赋值。我添加了一堆示例数据。
# input data
my $vehicles = [
{
'Z' => '12',
'X' => '11',
'Y' => '0',
},
{
'Z' => '300',
'X' => '2001',
'Y' => '100000',
}
];
my $list = [ { ID_NUMBER => 'ABC1234' }, { ID_NUMBER => 'ABC56778' } ];
# output data
my $endResult;
foreach my $hash_ref (@$list) {
my $hash; # needs to be inside of the loop!
if ( substr( $hash_ref->{ID_NUMBER}, 0, 3 ) eq 'ABC' ) {
push @{ $hash->{'ABC'} }, { # this becomes the array
$hash_ref->{ID_NUMBER} => { # and everything below needs
VEHICLES => $vehicles, # to be constructed directly
}
};
push @$endResult, $hash;
}
}
这将产生以下数据结构(输出为data::Printer):
[
[0] {
ABC [
[0] {
ABC1234 {
VEHICLES [
[0] {
X 11,
Y 0,
Z 12
},
[1] {
X 2001,
Y 100000,
Z 300
}
]
}
}
]
},
[1] {
ABC [
[0] {
ABC56778 {
VEHICLES var[0]{ABC}[0]{ABC1234}{VEHICLES}
}
}
]
}
]
请注意,变量名的选择使这变得非常复杂。它很难阅读,以后也很难维护。总是根据它们所代表的内容来选择变量名。将它们命名为$vehicle
、$ids
或$stuff_we_need_to_take_care_off_later
,但不要命名为$hash
1)。
1:除非你使用哈希算法,我们谈论的是结果。:)