Искаженная строка JSON при использовании perl и earthexplorer
В настоящее время я работаю с EarthExplorer от USGS, чтобы настроить некоторые пакетные загрузки сцен Landsat на основе пространственных координат. Они предоставляют замечательный удобный скрипт для этого по адресу https://earthexplorer.usgs.gov/inventory/example/json-download_data-pl это здорово. Я работаю над кластером, и, несмотря на правильную установку всех модулей Perl, при запуске сценария я получаю следующий вывод:
Running Script...
Error: Error: malformed JSON string, neither array, object, number, string or
atom, at character offset 0 (before "LWP will support htt...") at ./dl.pl line 182
Это кажется любопытным. В качестве объяснения сценарий начинается с
#!/usr/bin/perl
#use strict;
use warnings;
use 5.010;
use JSON;
use Scalar::Util qw(looks_like_number reftype dualvar );
use LWP::UserAgent;
use Getopt::Long qw(GetOptions);
my ($username, $password);
$username = "myusername_filled_in";
$password = "mypassword_filled_in";
GetOptions(
'username=s' => \$username,
'password=s' => \$password,
) or die "Error retrieving Username and Password\n";
и оскорбительный бит кода
$res = $response->{_content};
$res = decode_json $res;
Следуя очень полезному совету в Не могу запустить скрипт Perl на другом компьютере, я сделал следующее:
Изменено
$response->content
в$response->decoded_content( charset => 'none')
в оскорбительной области кода.Ран
lwp-request https://google.com/
которая только что вернула полную веб-страницу - без ошибок. Так что, похоже, работает.Пытался увидеть некоторую отладку, вставив
print $response->decoded_content( charset => 'none');
который затем бросил ошибку
LWP will support https URLs if the LWP::Protocol::https module is installed.
И действительно, LWP::Protocol::https установлен.
Я чувствую, что должно быть что-то простое, что мне не хватает - что-то вроде того, как я определил свое имя пользователя и пароль (просто $username = "myusername";
и т.д., после того как переменные объявлены) или что-то еще asinine.
Кто-нибудь еще сталкивался с этим?
Чтобы добавить вывод из запроса ниже:
$ which cpan ; head -n 1 `which cpan` ; echo 'o conf' | cpan | grep -P 'make|mbuild' ; set | grep ^PERL ; which perl ; perl -le'use LWP::Protocol::https; print "ok";'
/share/pkg/perl/5.10.1/bin/cpan
#!/share/pkg/perl/5.10.1/bin/perl
make [/usr/bin/make]
make_arg []
make_install_arg []
make_install_make_command [/usr/bin/make]
makepl_arg []
mbuild_arg []
mbuild_install_arg []
mbuild_install_build_command [./Build]
mbuildpl_arg []
PERL5LIB=/home/jb92b/perl5/lib/perl5:/home/jb92b/perl5/lib/perl5:/home/jb92b/perl5/lib/perl5
PERL_LOCAL_LIB_ROOT=/home/jb92b/perl5:/home/jb92b/perl5:/home/jb92b/perl5
PERL_MB_OPT='--install_base "/home/jb92b/perl5"'
PERL_MM_OPT=INSTALL_BASE=/home/jb92b/perl5
/share/pkg/perl/5.10.1/bin/perl
ok
2 ответа
Ваш код не проверяет на ошибки. Вы должны иметь что-то вроде
$response->is_success()
or die("Can't fetch X: ".$response->status_line());
Проблема, с которой вы сталкиваетесь, заключается в том, что LWP::Protocol::https не установлен.
Вы утверждаете, что это так, но Perl является авторитетным здесь:) Он не был установлен этим Perl, вы установили его в нестандартный каталог без указания Perl искать его там, или есть проблема с разрешениями.
В этом случае ваш скрипт использует /usr/bin/perl
, но вы установили модуль с помощью / для /share/pkg/perl/5.10.1/bin/perl
, Вам нужно переключиться, который perl
ваш скрипт использует, или вам нужно установить модуль, используя / для /usr/bin/perl
,
что-то вроде того, как я определил свое имя пользователя и пароль (просто $username = "myusername";
и т. д. после объявления переменных)
Вы не должны изменять код, чтобы добавить свое имя пользователя и пароль. Как это написано, призыв к GetOptions
перезапишу их. Вы должны использовать
program.pl --usernam myusername --password mypassword