将数组与现有复杂哈希结构中的键相关联的方法

时间:2011-12-22 21:43:53

标签: perl

我有两个excel文件。第一个excel文件是这样的:

12   A    P1  
23   B    P5
24   C    P2
15   D    P1
06   E    P5

第二个excel文件是这样的:

06 100
23 20
06 200
06 95
23 05
24 18

我想生成以下数据结构

$VAR1 = {
  'P5' => {
    'E' => '06' => [100, 200, 95]
    'B' => '23' => [20, 1000, 05, 30]
      },
      'P2' => {
        'C' => '24' => [18, 23, 2300, 3456]
  },
      'P1' => {
        'A' => '12' => [24, 25, 3200, 5668]
        'D' => '15' => [168]
      }
};

第一个excel文件使我能够生成以下数据结构。

 $VAR1 = {
   'P5' => {
     'E' => '06',
     'B' => '23'
    },
    'P2' => {
      'C' => '24'
    },
    'P1' => {
      'A' => '12',
      'D' => '15'
    }
  };

我从第一个excel文件中实现上述部分结构所做的工作如下:

my %Var1;
for my $i (1 .. $row1)
{
    # for simplicity, I just keep the main part to building this hash chain
    $Var1{$column3}->{$column2} = {$column1};  
}                

此处$column3p1p2等有关; $column2EB等有关,$column1062324等有关。与$column1关联的数组将从第二个excel文件中提取。

我的问题是如何遍历这个部分完成的哈希%Var1,并且对于每个键,例如06,在遍历第二个excel文件时将100推入其中。

1 个答案:

答案 0 :(得分:1)

所以,假设(我调用数字键(本例中为'06'))是唯一的,那么也许是一个返回arrayref的函数:

sub get_arrayref_from_nkey {
    my $target = shift;
    for my $pkey ( keys %Var1 ) {
        for my $akey ( keys %{ $Var1{$pkey} } ) {
            for my $nkey ( keys %{ $Var1{$pkey}->{$akey} } ) {
                if ( $nkey eq $target ) {
                    # return the arrayref to [ 100, 200, 95, .. ]
                    return @{ $Var1{$pkey}->{$akey}->{$nkey} };
                }
            }
        }
    }
}

my $arrayref = get_arrayref_from_nkey('06');
push @{ $arrayref }, $value;    # 100

如果未找到数字键,则该函数将返回undef。此外,如果数字键不唯一,那么这将不起作用 - 因为它将返回它找到的第一个nkey。