从arrayref生成哈希时定义数组



我不确定我是否在这里使用正确的术语,但我正在尝试通过数组循环并创建数组和值的哈希。

目前我的代码是这样的:

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:除非你使用哈希算法,我们谈论的是结果。:)

最新更新