Цикл по структуре JSON в Perl - PullRequest
0 голосов
/ 21 сентября 2018

Как заполнить список данными JSON?

Вот мой код:

my $groups = get_groups($t);
my @group;
my $i = 0;
do {
    push(@group, {
        groups  => [
            { type => $groups->{groups}->[$i]->{type} , group => $groups->{groups}->[$i]->{group} },
        ]
    });
    $i++;
} while ($i < length $groups->{groups});

Вот пример json:

{
    "error":false,
    "message":"success",
    "group":[
        {"type":1,"group":"group1"},
        {"type":2,"group":"group2"},
        {"type":3,"group":"group3"},
        {"type":4,"group":"group4"},
        {"type":5,"group":"group5"}
    ]
}

Функция get_groups($t); будетвернитесь выше JSON.Я хочу получить массив group и поместить его в список groups.Но я получил:

Невозможно использовать строку ("0") в качестве ссылки HASH, когда используются "строгие ссылки"

1 Ответ

0 голосов
/ 21 сентября 2018

С документация length:

Возвращает длину в символах значения EXPR.Если EXPR опущен, возвращает длину $ _.Если EXPR не определен, возвращает undef.

Эта функция не может использоваться для всего массива или хэша, чтобы узнать, сколько элементов у них есть.Для этого используйте скалярные @array и скалярные ключи% хеша соответственно.

Чтобы получить количество элементов в ссылке на массив, необходимо разыменовать его и поместить в scalar context.

my $foo = [ qw/a b c/ ];
my $number_of_elements = scalar @{ $foo }; # 3

То, что вы на самом деле хотите сделать, - это выполнить цикл по каждой команде в массиве groups.Нет необходимости получать количество элементов.

my @teams;
foreach my $team ( @{ $opsteams->{teams} } ) {
    push @teams, {
        type => $team->{type},
        team => $team->{team},
    };
}

В вашем коде есть несколько дополнительных уровней глубины.Я не уверен, для чего они.На самом деле, похоже, что вы просто хотите команды в @teams, что на самом деле будет

my @teams = @{ $opsteams->{teams} };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...