метод связывания массива с ключом в существующей сложной хеш-структуре - PullRequest
0 голосов
/ 23 декабря 2011

У меня есть два файла Excel.Первый файл Excel выглядит следующим образом:

12   A    P1  
23   B    P5
24   C    P2
15   D    P1
06   E    P5

Второй файл Excel выглядит следующим образом:

06 100
23 20
06 200
06 95
23 05
24 18

Я хочу создать следующую структуру данных

$VAR1 = {
  'P5' => {
    'E' => '06' => [100, 200, 95]
    'B' => '23' => [20, 1000, 05, 30]
      },
      'P2' => {
        'C' => '24' => [18, 23, 2300, 3456]
  },
      'P1' => {
        'A' => '12' => [24, 25, 3200, 5668]
        'D' => '15' => [168]
      }
};

Первый файл Excel позволяет мне создать следующую структуру данных.

 $VAR1 = {
   'P5' => {
     'E' => '06',
     'B' => '23'
    },
    'P2' => {
      'C' => '24'
    },
    'P1' => {
      'A' => '12',
      'D' => '15'
    }
  };

То, что я сделал для реализации вышеуказанной частичной структуры из первого файла Excel, выглядит следующим образом:

my %Var1;
for my $i (1 .. $row1)
{
    # for simplicity, I just keep the main part to building this hash chain
    $Var1{$column3}->{$column2} = {$column1};  
}                

Здесь $column3 относится к p1, p2,так далее;$column2 относится к E, B и т. Д., А $column1 относится к 06, 23, 24 и т. Д.Массивы, связанные с $column1, будут извлечены из второго файла Excel.

Мой вопрос заключается в том, как перебрать этот частично законченный хеш %Var1 и для каждого ключа, например 06, вставить 100 в него при обходе второго файла Excel.

1 Ответ

1 голос
/ 23 декабря 2011

Итак, если предположить (что я называю числовой ключ (в данном примере «06»)) уникально, то, возможно, функция, которая возвращает arrayref:

sub get_arrayref_from_nkey {
    my $target = shift;
    for my $pkey ( keys %Var1 ) {
        for my $akey ( keys %{ $Var1{$pkey} } ) {
            for my $nkey ( keys %{ $Var1{$pkey}->{$akey} } ) {
                if ( $nkey eq $target ) {
                    # return the arrayref to [ 100, 200, 95, .. ]
                    return @{ $Var1{$pkey}->{$akey}->{$nkey} };
                }
            }
        }
    }
}

my $arrayref = get_arrayref_from_nkey('06');
push @{ $arrayref }, $value;    # 100

Если числовой ключнашел, что функция вернет undef.Кроме того, если числовой ключ не является уникальным, это не будет работать - потому что он вернет первый найденный nkey.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...