Как обратиться к конкретному элементу массива в сложной структуре данных в Perl - PullRequest
0 голосов
/ 13 мая 2019

У меня сложная структура данных JSON в Perl, как в следующем примере.Я хочу обратиться к элементу массива и хранить данные.

Переменная

$VAR1 = {
  'dummy' => 'foo',
  'profiles' => {
    'Tags' => [
                {
                  '###PLACEHOLDER###',
                }
              ],
}

Я могу, например, добавить элемент в "### PLACEHOLDER ###", но хочу позже в perlскрипт для добавления под этим заполнителем дополнительной информации.Обычно я обращаюсь к этим элементам с помощью $ var -> {profile} -> {Tags} -> {PLACEHOLDER}, но это не работает с массивом.

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

Любой совет?

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Мне не ясно, что вы, что означает "добавление элемента в ###PLACEHOLDER###". Элементы могут быть добавлены к массивам и хэшам, и неясно, к какому массиву или хешу вы обращаетесь.


Чтобы добавить элемент в массив, на который ссылается $var->{profiles}{Tags}, используйте

push @{ $var->{profiles}{Tags} }, $val;

В результате

$VAR1 = {
  'dummy' => 'foo',
  'profiles' => {
    'Tags' => [
                {
                  '###PLACEHOLDER###' => undef,
                },
                $val
              ],
}

Чтобы добавить элемент в хеш, на который ссылается последний элемент массива, на который ссылается $var->{profiles}{Tags}, используйте

$var->{profiles}{Tags}[-1]{$key} = $val;

В результате

$VAR1 = {
  'dummy' => 'foo',
  'profiles' => {
    'Tags' => [
                {
                  '###PLACEHOLDER###' => undef,
                  $key => $val,
                },
              ],
}

Конечно, если $key равно ###PLACEHOLDER###, это приводит к

$VAR1 = {
  'dummy' => 'foo',
  'profiles' => {
    'Tags' => [
                {
                  '###PLACEHOLDER###' => $val,
                },
              ],
}
1 голос
/ 13 мая 2019

[ОБНОВЛЕНИЕ: используется dpathr вместо dpath для ссылок на структуры]

[ОБНОВЛЕНИЕ: используется dpath вместо dpathr для ссылок на элементы]

Data :: DPath может делать то, что вам нужно. Вот код, который возвращает ссылку на любую структуру (хеш или массив), которая содержит элемент, значение которого ###PLACEHOLDER###:

use strict;
use warnings;

use Data::Dumper;
use Data::DPath qw[ dpath dpathr ];

my $struct = {
    'dummy'    => 'foo',
    'profiles' => {
        'ARRAY' => [ '###PLACEHOLDER###' ],
        'HASH' => { key => '###PLACEHOLDER###' },
    },
};

my $path = dpath( '//[value eq "###PLACEHOLDER###"]/..' );

my @matches = $path->match( $struct );

print Dumper \@matches;

Результат:

$VAR1 = [
          [
            '###PLACEHOLDER###'
          ],
          {
            'key' => '###PLACEHOLDER###'
          }
        ];

Если вы хотите получить прямой доступ к элементу, измените путь на

my $path = dpathr( '//*[value eq "###PLACEHOLDER###"]' );

с результатом:

$VAR1 = [
          \'###PLACEHOLDER###',
          \'###PLACEHOLDER###'
        ];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...