Perl 如何为每个子哈希增加哈希值
我想从0开始为每个$COMMUNITY增加hash的值,我定义了一个数组@indicator,从0到数组@NAME的同一个索引,并将它推到值,但这不是我想要的值,我不知道如何做到这一点。我很清楚,值不在顺序中,因为数组中的位置没有首先组织好,但如何准确地执行此操作,然后, 如何打印subhash$FAMILY的每个第一个值。 比如说,Perl 如何为每个子哈希增加哈希值,perl,Perl,我想从0开始为每个$COMMUNITY增加hash的值,我定义了一个数组@indicator,从0到数组@NAME的同一个索引,并将它推到值,但这不是我想要的值,我不知道如何做到这一点。我很清楚,值不在顺序中,因为数组中的位置没有首先组织好,但如何准确地执行此操作,然后, 如何打印subhash$FAMILY的每个第一个值。 比如说, community 0 = name 0 4 7 community 1 = name 0 3 8 community 2 = name 0 3 6 预期产出
community 0 = name 0 4 7
community 1 = name 0 3 8
community 2 = name 0 3 6
预期产出:
$VAR1 = {
'0' => {
'A' => {
'AA' => [
0
],
'AB' => [
1
],
'AC' => [
2
],
'AD' => [
3
]
},
'B' => {
'BA' => [
4
],
'BB' => [
5
],
'BC' => [
6
]
},
'C' => {
'CA' => [
7
],
'CB' => [
8
],
'CC' => [
9
]
}
},
'1' => {
'A' => {
'AA' => [
0
],
'AB' => [
1
],
'AC' => [
2
]
},
'B' => {
'BA' => [
3
],
'BB' => [
4
],
'BC' => [
5
],
'BD' => [
6
],
'BE' => [
7
]
},
'C' => {
'CA' => [
8
],
'CB' => [
9
],
'CC' => [
10
]
}
},
'2' => {
'A' => {
'AA' => [
0
],
'AB' => [
1
],
'AC' => [
2
]
},
'B' => {
'BA' => [
3
],
'BB' => [
4
],
'BC' => [
5
]
},
'C' => {
'CA' => [
6
],
'CB' => [
7
],
'CC' => [
8
],
'CD' => [
9
],
'CE' => [
10
],
'CF' => [
11
]
}
}
};
您需要按社区迭代元素,为每个社区重置计数器。因此,我首先创建了没有计数器的结构,然后在设置值时按正确的顺序对其进行迭代
#!/usr/bin/perl
use strict;
use warnings;
use Tie::Autotie 'Tie::IxHash';
my @NAMES = qw(AA AB AC BA BB BC CA CB CC AA AB AC BA BB BC CA CB CC AA AB AC BA BB BC CA CB CC AD CD CE CF BD BE);
my @FAMILIES = qw(A A A B B B C C C A A A B B B C C C A A A B B B C C C A C C C B B);
my @COMMUNITIES = qw(0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 0 2 2 2 1 1);
tie my %community_family_name, 'Tie::IxHash' ;
undef $community_family_name{ $COMMUNITIES[$_] }{ $FAMILIES[$_]}{$NAMES[$_]}
for 0 .. $#NAMES;
for my $community (keys %community_family_name) {
my $i = 0;
for my $family (keys %{ $community_family_name{$community} }) {
for my $name (keys %{ $community_family_name{$community}{$family} }) {
$community_family_name{$community}{$family}{$name} = [$i++];
}
}
}
use Data::Dumper; print Dumper(\%community_family_name);
注意:您确定这些值需要在数组ref中吗?永远不会有超过一个值
按照惯例,在Perl中,小写名称用于可变变量。您需要按社区迭代元素,为每个社区重置计数器。因此,我首先创建了没有计数器的结构,然后在设置值时按正确的顺序对其进行迭代
#!/usr/bin/perl
use strict;
use warnings;
use Tie::Autotie 'Tie::IxHash';
my @NAMES = qw(AA AB AC BA BB BC CA CB CC AA AB AC BA BB BC CA CB CC AA AB AC BA BB BC CA CB CC AD CD CE CF BD BE);
my @FAMILIES = qw(A A A B B B C C C A A A B B B C C C A A A B B B C C C A C C C B B);
my @COMMUNITIES = qw(0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 0 2 2 2 1 1);
tie my %community_family_name, 'Tie::IxHash' ;
undef $community_family_name{ $COMMUNITIES[$_] }{ $FAMILIES[$_]}{$NAMES[$_]}
for 0 .. $#NAMES;
for my $community (keys %community_family_name) {
my $i = 0;
for my $family (keys %{ $community_family_name{$community} }) {
for my $name (keys %{ $community_family_name{$community}{$family} }) {
$community_family_name{$community}{$family}{$name} = [$i++];
}
}
}
use Data::Dumper; print Dumper(\%community_family_name);
注意:您确定这些值需要在数组ref中吗?永远不会有超过一个值
按照惯例,Perl中可变变量使用小写名称。是的,对于每个$name subhash键,只包含1个值,因为我以后需要调用这些键,或者不在数组ref中是可行的?谢谢你的提示。真的谢谢你。因此你可以只分配
$i++
,而不使用方括号。undef散列有什么用?它创建了结构,以便你以后可以按预期的顺序对其进行迭代。是的,对于每个$name subhash键,只包含1个值,因为我以后需要调用这些键,或者不在数组ref中是可行的?谢谢你的提示。真的谢谢你。因此你可以只分配$i++
,而不使用方括号。undef hash有什么用?它创建了结构,以便你以后可以按预期顺序对其进行迭代。
#!/usr/bin/perl
use strict;
use warnings;
use Tie::Autotie 'Tie::IxHash';
my @NAMES = qw(AA AB AC BA BB BC CA CB CC AA AB AC BA BB BC CA CB CC AA AB AC BA BB BC CA CB CC AD CD CE CF BD BE);
my @FAMILIES = qw(A A A B B B C C C A A A B B B C C C A A A B B B C C C A C C C B B);
my @COMMUNITIES = qw(0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 0 2 2 2 1 1);
tie my %community_family_name, 'Tie::IxHash' ;
undef $community_family_name{ $COMMUNITIES[$_] }{ $FAMILIES[$_]}{$NAMES[$_]}
for 0 .. $#NAMES;
for my $community (keys %community_family_name) {
my $i = 0;
for my $family (keys %{ $community_family_name{$community} }) {
for my $name (keys %{ $community_family_name{$community}{$family} }) {
$community_family_name{$community}{$family}{$name} = [$i++];
}
}
}
use Data::Dumper; print Dumper(\%community_family_name);