解释
一个数组包含一组键。这些键的值是内部哈希值。这些内部哈希的键,在这种情况下是数字(如数组索引)。另一个数组保存内部哈希的值。
问题:
如何使用正确的相应值填充外部哈希键(即正确的内部哈希)?
约束上
我更喜欢使用切片,贴图或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);
但尚未获得任何目标。
答案 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
};
}