Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何为每个子哈希增加哈希值_Perl - Fatal编程技术网

Perl 如何为每个子哈希增加哈希值

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 预期产出

我想从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

预期产出:

 $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);