我不确定我是否在这里使用正确的术语,但我试图循环一个数组并创建一个数组和值的散列。
目前我的代码如下:
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
),而不是它是怎样的。如果我需要更好地澄清,请告诉我,但我无法找到正确的语法,以便在构建哈希时实现这一点。
答案 0 :(得分:2)
要将长按键放入单个数组引用中,您需要更改数据结构的分配。我添加了一堆示例数据。
# 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:除非您使用散列算法,否则我们正在谈论结果。 :)功能