Как сохранить Второе Измерение Хэша В Порядке Perl - PullRequest
0 голосов
/ 22 октября 2018

Как я могу сохранить эти Массивы в этот хэш Массивы в порядке, не следуя по алфавиту порядке, просто сохранить в соответствии с Массивы

1002 * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -. StackOverflow не позволит мне размещать, потому что не хватаетдетали, поэтому я сделал это -
#!/usr/bin/perl 

use warnings;
use strict;
use Tie::IxHash;
use Data::Dumper;

my @NAME= 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 @FAMILY= 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 @COMMUNITY= 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' ;

push @{ $COMMUNITY_FAMILY_NAME{ $COMMUNITY[$_] }{ $FAMILY[$_] } }, $NAME[$_]  for 0 .. $#NAME;
print Dumper(\%COMMUNITY_FAMILY_NAME);

Вывод:

$VAR1 = {
          '0' => {
                   'A' => [
                            'AA',
                            'AB',
                            'AC',
                            'AD'
                          ],
                   'C' => [
                            'CA',
                            'CB',
                            'CC'
                          ],
                   'B' => [
                            'BA',
                            'BB',
                            'BC'
                          ]
                 },
          '1' => {
                   'A' => [
                            'AA',
                            'AB',
                            'AC'
                          ],
                   'C' => [
                            'CA',
                            'CB',
                            'CC'
                          ],
                   'B' => [
                            'BA',
                            'BB',
                            'BC',
                            'BD',
                            'BE'
                          ]
                 },
          '2' => {
                   'A' => [
                            'AA',
                            'AB',
                            'AC'
                          ],
                   'C' => [
                            'CA',
                            'CB',
                            'CC',
                            'CD',
                            'CE',
                            'CF'
                          ],
                   'B' => [
                            'BA',
                            'BB',
                            'BC'
                          ]
                 }
        };

Ожидаемый вывод:

$VAR1 = {
          '0' => {
                   'A' => [
                            'AA',
                            'AB',
                            'AC',
                            'AD'
                          ],
                   'B' => [
                            'BA',
                            'BB',
                            'BC'
                          ]
                   'C' => [
                            'CA',
                            'CB',
                            'CC'
                          ],
                 },
          '1' => {
                   'A' => [
                            'AA',
                            'AB',
                            'AC'
                          ],
                   'B' => [
                            'BA',
                            'BB',
                            'BC',
                            'BD',
                            'BE'
                   'C' => [
                            'CA',
                            'CB',
                            'CC'
                          ],

                          ]
                 },
          '2' => {
                   'A' => [
                            'AA',
                            'AB',
                            'AC'
                          ],
                   'B' => [
                            'BA',
                            'BB',
                            'BC'
                          ]
                   'C' => [
                            'CA',
                            'CB',
                            'CC',
                            'CD',
                            'CE',
                            'CF'
                          ],
                 }
        };

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что связанный хеш влияет только на один уровень - каждое значение связанного хэша - это то, что вы храните в нем, что обычно является нормальным значением perl.Это означает, что если вам нужен многомерный связанный хеш, необходимо связать как переменную верхнего уровня, так и любые значения, хранящиеся в ней (в данном случае, hashrefs).

Например:

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
use Tie::IxHash;

tie my %hash, 'Tie::IxHash';
tie %{$hash{"b"}}, 'Tie::IxHash';
tie %{$hash{"c"}}, 'Tie::IxHash';

$hash{"b"}->{"b"} = [ qw/1 2 3/ ];
$hash{"b"}->{"a"} = [ qw/4 5 6/ ];
$hash{"c"}->{"d"} = [ qw/7 8 9/ ];
$hash{"c"}->{"c"} = [ qw/10 11 12/ ];

print Dumper(\%hash);
0 голосов
/ 22 октября 2018

Ваши субшиши не привязаны к Tie::IxHash, и, следовательно, они просты / неупорядочены.Вы можете изменить это на tie каждый субхеш перед использованием.

# push @{ $COMMUNITY_FAMILY_NAME{ $COMMUNITY[$_] }{ $FAMILY[$_] } }, $NAME[$_]  for 0 .. $#NAME;

for (0 .. $#NAME) {
    my $href = $COMMUNITY_FAMILY_NAME{ $COMMUNITY[$_] } ||= do {
        tie my %hash, 'Tie::IxHash';
        \%hash;
    };
    push @{ $href->{ $FAMILY[$_] } }, $NAME[$_];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...