dgB*_*gBP 6 perl hash-of-hashes
我有一个Perl散列的哈希值...大约11或12个元素深.请原谅我没有重复下面的结构!
一些级别具有固定标签,例如'NAMES','AGES'或类似,因此访问这些级别是好的,因为我可以直接使用标签,但我需要循环其他变量,这导致一些非常长的语句.这是一组循环的一半示例:
foreach my $person (sort keys %$people) {
foreach my $name (sort keys %{$people->{$person}{'NAMES'}}) {
foreach my $age (sort keys %{$people->{$person}{'NAMES'}{$name}{'AGES'}}) {
. . . # and so on until I get to the push @list,$element; part
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,但它遵循我所拥有的结构.没有固定名称部分(大写字母中的元素)可能会更短,但是出于参考目的需要它们.
我尝试将这些元素作为哈希来缩短它,以便在每个阶段缩短它,例如,对于第二个foreach,我尝试了各种形式:
foreach my $name (sort keys %{$person->{'NAMES'}})
Run Code Online (Sandbox Code Playgroud)
但这没用.我确定我以前见过类似的东西,所以语义可能不正确.
我已经研究过关于Hash of Hashes的页面以及对哈希及其元素的引用等等,但没有运气.我已经看过while each循环的例子,但它们似乎没有特别简短或更容易实现.也许只有一种不同的方法可以做到这一点,我忽略了这一点.我已经写出了一整套foreach循环,如果我不必再重复六次左右就会很棒.
当然,可能没有'简单'的方式,但所有的帮助赞赏!
$person 是关键,要缩短内部循环的内容,需要将值赋给某些东西:
foreach my $person_key (sort keys %$people) {
my $person = $people->{$person_key};
my $names = $person->{NAMES};
foreach my $name (sort keys %$names) {
Run Code Online (Sandbox Code Playgroud)
您也可以使用每个关键字.这肯定应该有所帮助.
while( my ($person, $val1) = each(%$people) ) {
while( my ($name, $val2) = each(%$val1) ) {
while( my ($age, $val3) = each(%$val2) ) {
print $val3->{Somekey};
Run Code Online (Sandbox Code Playgroud)