使用 perl 和 earthexplorer 时出现格式错误的 JSON 字符串
Malformed JSON string when using perl and earthexplorer
我目前正在使用 USGS 的 EarthExplorer 来设置一些基于空间坐标的 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;
根据 Can't run Perl script on other computer 中非常有用的建议,我做了以下事情:
在有问题的代码区域将 $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";
等,在声明变量之后)或其他一些愚蠢的东西。
还有其他人 运行 参与其中吗?
添加以下查询的输出:
$ 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
您的代码没有检查错误。你应该有类似
的东西
$response->is_success()
or die("Can't fetch X: ".$response->status_line());
您遇到的问题是 LWP::Protocol::https 没有安装。
你声称是,但 Perl 在这里是权威的 :) 它不是由那个 Perl 安装的,你将它安装在一个非标准目录而没有告诉 Perl 在那里寻找它,或者存在权限问题。
在这种情况下,您的脚本使用 /usr/bin/perl
,但您安装了模块 using/for /share/pkg/perl/5.10.1/bin/perl
。您需要切换脚本使用的 perl
,或者您需要安装模块 using/for /usr/bin/perl
。
"something like how I defined my username and password (just $username = "myusername";
etc., after the variables are declared)"
您不应修改代码来添加您的用户名和密码。按照它的编写方式,对 GetOptions
的调用将覆盖它们。你应该使用
program.pl --usernam myusername --password mypassword
我目前正在使用 USGS 的 EarthExplorer 来设置一些基于空间坐标的 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;
根据 Can't run Perl script on other computer 中非常有用的建议,我做了以下事情:
在有问题的代码区域将
$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";
等,在声明变量之后)或其他一些愚蠢的东西。
还有其他人 运行 参与其中吗?
添加以下查询的输出:
$ 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
您的代码没有检查错误。你应该有类似
的东西$response->is_success()
or die("Can't fetch X: ".$response->status_line());
您遇到的问题是 LWP::Protocol::https 没有安装。
你声称是,但 Perl 在这里是权威的 :) 它不是由那个 Perl 安装的,你将它安装在一个非标准目录而没有告诉 Perl 在那里寻找它,或者存在权限问题。
在这种情况下,您的脚本使用 /usr/bin/perl
,但您安装了模块 using/for /share/pkg/perl/5.10.1/bin/perl
。您需要切换脚本使用的 perl
,或者您需要安装模块 using/for /usr/bin/perl
。
"something like how I defined my username and password (just $username = "myusername";
etc., after the variables are declared)"
您不应修改代码来添加您的用户名和密码。按照它的编写方式,对 GetOptions
的调用将覆盖它们。你应该使用
program.pl --usernam myusername --password mypassword