id
- это ключ в ссылке ha sh, которую вы возвращаете, и вы хотите получить ее значение, которое является ссылкой на массив. Вы можете сохранить это в качестве ссылки или сразу получить его элементы:
#!perl
use v5.24;
use JSON qw(from_json);
my $data = '{"total":325,"id": [78,234,737]}';
my $json = from_json($data);
# get the hash key to get the hash value, which is an array reference
my $ids_array_ref = $json->{id};
# OR, use the postfix dereference to get the ids as a normal list
my @ids_array = $json->{id}->@*;
# OR, use the older circumfix notation (before Perl v5.24). These are all
# the same:
my @ids_array = @{ $json->{id} };
my @ids_array = @{ $ids_array_ref };
my @ids_array = @$ids_array_ref;
Например:
#!perl
use v5.24;
use JSON qw(from_json);
my $data = '{"total":325,"id": [78,234,737]}';
my $json = from_json($data);
foreach my $id ( $json->{id}->@* ) {
say "Got id $id";
}
Это выводит:
Got id 78
Got id 234
Got id 737
Но, Вы должны обрабатывать и другие типы значений ha sh. Чтобы решить, как печатать что-то, вы должны проверить, является ли это ссылкой и какой это тип ссылки (я игнорирую другие виды здесь):
#!perl
use v5.24;
use JSON qw(from_json);
my $data = '{"total":325,"id": [78,234,737]}';
my $json = from_json($data);
foreach my $key ( keys $json->%* ) {
print "$key: ";
if( ref $json->{$key} eq 'ARRAY' ) {
say join ' ', $json->{$key}->@*;
}
elsif( ref $json->{$key} ) { # all other reference types
warn "I don't handle this yet"
}
else {
say $json->{$key};
}
}
Но, вы можете иметь более глубокие уровни вложения, так что вам тоже нужно подумать об этом, если вы хотите вывести все. Если я знаю, какие ключи мне нужны, я не буду пытаться go пройти через все в общем. Я go хочу напрямую Я хочу:
#!perl
use v5.24;
use JSON qw(from_json);
my $data = '{"total":325,"id": [78,234,737]}';
my $json = from_json($data);
say "id: ", join ' ', $json->{id}->@*;
say "total: ", $json->{total};
Ваш исходный код был вдвойне сложным. Результат from_json
является ссылкой, которая представляет структуру данных JSON. Это JSON объект, который Perl называет ха sh, поэтому вы получаете ссылку ha sh.
my $hash_ref = from_json( $data );
Ваш пример почти сработал, потому что вы получили массив один элемент, который является ссылкой ha sh. Другой foreach
затем перебирает этот один элемент. Избавьтесь от этого внешнего массива, и вы избавитесь от внешнего l oop.
Мы покрываем ссылки и структуры данных в Intermediate Perl, хотя perlds c тоже хорошо. У нас есть длинные примеры глубоко вложенных и рекурсивных структур данных.
Если вы новичок, вы можете начать с Learning Perl, хотя.