Искаженная строка 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 на другом компьютере, я сделал следующее:

  1. Изменено $response->content в $response->decoded_content( charset => 'none') в оскорбительной области кода.

  2. Ран lwp-request https://google.com/ которая только что вернула полную веб-страницу - без ошибок. Так что, похоже, работает.

  3. Пытался увидеть некоторую отладку, вставив 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
Другие вопросы по тегам