从arrayref进行散列时定义数组

时间:2015-10-12 13:06:38

标签: perl

我不确定我是否在这里使用正确的术语,但我试图循环一个数组并创建一个数组和值的散列。

目前我的代码如下:

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指向哈希数组(ABC1234ABC46778),而不是它是怎样的。如果我需要更好地澄清,请告诉我,但我无法找到正确的语法,以便在构建哈希时实现这一点。

1 个答案:

答案 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:除非您使用散列算法,否则我们正在谈论结果。 :)功能