填充HoH,其外部散列键位于一个数组中,内部散列值位于另一个数组中

时间:2011-07-12 16:03:26

标签: perl data-structures

解释

一个数组包含一组键。这些键的值是内部哈希值。这些内部哈希的键,在这种情况下是数字(如数组索引)。另一个数组保存内部哈希的值。

问题:

如何使用正确的相应值填充外部哈希键(即正确的内部哈希)?

约束上

我更喜欢使用切片,贴图或grep的解决方案。消除循环级联

我意识到它应该是一个HoA。但这只是我学习,它没有功能价值......

工作代码

此代码可以按我的意愿运行,但我想使用更高级的技术:

#! usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my %register=();

my @classNames = ('Science_class', 'Math_class');
my @Science_class_student_names = ('George', 'Lisa', 'Mathias'); #prob from file
my @Math_class_student_names = ('Martin', 'Anna', 'Peter', 'George'); #prob from file

foreach my $className (@classNames) {
    my $array_name = $className.'_'.'student_names';
    if ($array_name =~ /Science/) {
        foreach (0..$#Science_class_student_names ) {
            $register{$className}{$_ + 1} = $Science_class_student_names[$_];
        }
    }
    elsif ($array_name =~ /Math/) {
        foreach (0..$#Math_class_student_names ) {
            $register{$className}{$_ + 1} = $Math_class_student_names[$_];
        }
    }
}

print Dumper(\%register);

哈希切片适用于直接键值对,但中间键会让我失望。尝试类似:@register{@classNames} = map{$count => $student}

我有一个想法,在if语句之前是否有一种方法可以在数组名称中使用字符串:$#($array_name)student_names但是这不起作用。

另一个是分别创建所有内部哈希键的数组,使用切片然后将该哈希放入外部哈希。

我唯一的另一个想法是使用AoA来保存所有“内部哈希值”数组。 (即。my @studentNames = (\@Science_class_student_names, \@Math_class_student_names);但尚未获得任何目标。

1 个答案:

答案 0 :(得分:4)

一次一层地处理它更容易。对于内层,似乎你想要

1 => George,
2 => Lisa,
...

首先要弄清楚如何做到这一点。

map { $_+1 => $Science_class_student_names[$_] }
   0..$#Science_class_student_names

所以你最终得到了

$register{'Science_class'} = {
   map { $_+1 => $Science_class_student_names[$_] }
      0..$#Science_class_student_names
   }
};

$register{'Math_class'} = {
   map { $_+1 => $Math_class_student_names[$_] }
      0..$#Math_class_student_names
   }
};

如果你推广内层,你会得到

for (
   [ 'Science_class' => \@Science_class_student_names ],
   [ 'Math_class'    => \@Math_class_student_names ],
) {
   my ($class_name, $student_names) = @$_;
   $register{$class_name} = {
      map { $_+1 => $student_names->[$_] }
         0..$#$student_names
   };
}