Извлечение массива хеш-значений, отличных от одноуровневых, из вложенной структуры данных в perl - PullRequest
0 голосов
/ 12 января 2012

Это моя структура данных, созданная Data :: Dumper-> Dumper:

$VAR1 = {
          'name' => 'genomic',
          'class' => [
                     {
                       'reference' => [
                                      {
                                        'name' => 'chromosome',
                                        'referenced-type' => 'Chromosome'
                                      },
                                      {
                                        'name' => 'chromosomeLocation',
                                        'referenced-type' => 'Location'
                                      },
                                      {
                                        'name' => 'sequence',
                                        'referenced-type' => 'Sequence'
                                      },
                                      {
                                        'name' => 'sequenceOntologyTerm',
                                        'referenced-type' => 'SOTerm'
                                      }
                                    ],
                     }
                   ],
        };

(обрезано для ясности)

Я хотел бы вернуть ссылку на массив каждого значения имени по ссылке в одной строке.

В настоящее время у меня есть

$class->[0]{reference}[0..3]{name}

но безрезультатно.

Также в этом примере есть четыре хеша с индексами 0..3, как мне представить весь массив независимо от количества элементов?

Ответы [ 2 ]

1 голос
/ 12 января 2012

К сожалению, простого синтаксиса для этого нет.Вам нужно будет использовать map:

my $array_ref = [
    map { $_->{name} } @{ $class->[0]{reference} }
];

Тогда, если вы выгрузите $ array_ref, вы увидите, что оно содержит:

$array_ref = [
          'chromosome',
          'chromosomeLocation',
          'sequence',
          'sequenceOntologyTerm'
        ];

Если вам нужны ссылки на исходные строки(не копии), вам нужно просто поставить обратную косую черту до $_ (так что это будет \$_->{name} внутри карты).

0 голосов
/ 12 января 2012

$class->[0]{reference} является ссылкой на массив, поэтому вы должны разыменовать его с помощью @{}:

@{$class->[0]{reference}}

Является «целым массивом», затем вы можете использовать синтаксис слайса в конце, чтобы получитьчасть этого:

@{$class->[0]{reference}}[0..3]

Оттуда вы работаете с массивом хеш-ссылок, поэтому вам придется перебирать его с помощью for или map.

...