我有两个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};
}
此处$column3
与p1
,p2
等有关; $column2
与E
,B
等有关,$column1
与06
,23
,24
等有关。与$column1
关联的数组将从第二个excel文件中提取。
我的问题是如何遍历这个部分完成的哈希%Var1
,并且对于每个键,例如06
,在遍历第二个excel文件时将100
推入其中。
答案 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。