Ваша переменная содержит строку , которая представляет структуру данных в формате JSON .Вам нужно преобразовать его в структуру данных Perl, чтобы использовать его в Perl.На данный момент это просто набор текста, и HTTP :: Tiny не заботится о том, какие данные он возвращает.
Core Perl приносит модуль JSON :: PP начиная с версии 5.13.9 (с выпуском 5.14) .
use strict;
use warnings;
use JSON::PP 'decode_json';
use Data::Printer;
my $json = qq({ "foo" : "bar" });
my $decoded = decode_json($json);
p $decoded;
print $decoded->{foo};
Будет выведено:
\ {
foo "bar"
}
bar
Если у вас более новый Perl и у вас есть другиеУстановленный материал, возможно, у вас также есть JSON :: MaybeXS , который выберет самый быстрый анализатор JSON, доступный автоматически.
Теперь, если вы хотите, чтобы ваш пользовательский агент знал, как это сделатьв нескольких местах вы можете легко создать подкласс.Я сделал элементарную реализацию здесь.Сохраните его в новом файле HTTP/Tiny/DecodeJSON.pm
в нужной папке.Я бы поместил его в lib
в каталоге вашего скрипта.
.
├── lib
│ └── HTTP
│ └── Tiny
│ └── DecodeJSON.pm
└── script.pl
Я бы также предложил добавить расширенную обработку ошибок.
package HTTP::Tiny::DecodeJSON;
use strict;
use warnings;
use JSON::PP 'decode_json';
use parent 'HTTP::Tiny';
# we need this to not throw a warning in HTTP::Tiny::_agent()
use constant VERSION => '0.01';
sub get_json {
my $self = shift;
my $res = $self->get(@_);
# add error handling here ...
return decode_json $res->{content};
}
1;
Затем вы можете использовать его где угодно.Чтобы использовать его в своем скрипте, вам нужно добавить каталог lib
в список каталогов, которые Perl ищет для своих модулей.
use strict;
use warnings;
use Data::Printer;
use lib 'lib';
use HTTP::Tiny::DecodeJSON;
my $decoded = HTTP::Tiny::DecodeJSON->new->get_json(
'https://jsonplaceholder.typicode.com/todos/1'
);
p $decoded;