0

当我尝试在第二台计算机上运行脚本时,我收到以下消息:

格式错误的 JSON 字符串,既不是数组、对象、数字、字符串或原子,也不是字符偏移量 0
(在“LWP 将支持 htt...”之前)在 iptest.pl 第 21 行第 2 行。

在我的第一台计算机上,脚本运行良好。

第 21 行:

my $data = decode_json($resp->content);

有谁知道问题可能是什么?

提前致谢

4

5 回答 5

3

JSON 错误是您得到的唯一错误,我有点惊讶。但它确实包含一个小小的提示:“LWP 将支持 htt...”。我敢打赌 LWP 缺少一个它需要能够建立 https 连接的模块。您现在有两个选择:

  1. 打印$response->content以查看完整的错误消息。
  2. 在命令行上,执行类似lwp-request https://google.com/. 您应该会看到完整的错误消息。

然后安装缺少的模块。

当然:请,请,请:

  • use strictuse warnings
  • 清理该脚本并丢弃use您不需要的每一行:IO::Socket、LWP::Simple、YAML::Tiny。
  • 阅读您实际使用的模块的文档。你想用什么来实现LWP::UserAgent->new(keep_alive)?提示:引用 没有帮助keep_alive
于 2013-05-13T08:18:09.323 回答
2

一些问题:

  1. 始终使用use strict; use warnings;.
  2. 永远不要使用$response->content. 它返回的东西是无用的。相反,使用$response->decoded_content( charset => 'none').
  3. 您需要chomp从 STDIN 获得的值。
  4. our除非被迫(例如our @ISA= ok) ,否则您永远不应该使用。my应改为使用。
  5. my $format = '$format'; "$format"是一种愚蠢的写作方式"\$format"
于 2013-05-13T02:27:36.573 回答
1

我应用了 ikegami 建议的大部分更改。然后 perl 给了我很好的错误信息来解决剩下的问题。看起来它现在可以工作了。不要问为什么它以前不起作用。你的代码很奇怪,很难说到底出了什么问题。有了严格和警告,您将被迫编写更好的代码。也许添加一些很好命名的子程序以增加清晰度。

#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;
use LWP::UserAgent;
use open qw(:std :utf8);
use LWP::Simple;
use YAML::Tiny;
use JSON;
use URI;
use List::MoreUtils qw(uniq);

print "Enter Qve:";
my ( $qve, $loc, $key, $href );
chomp( $qve = <STDIN> );
print "Enter Location:";
chomp( $loc = <STDIN> );

$key = '';
my $format = '$format';
$href =
"https://api.datamarket.azure.com/Bing/Search/v1/Web?Query='$qve [loc:$loc]'&Latitude=43&Longitude=19&$format=JSON";
my $ua = LWP::UserAgent->new('keep_alive');
$ua->credentials( "api.datamarket.azure.com" . ':443', '', '', $key );
my $resp = $ua->get($href);
my $data = decode_json( $resp->decoded_content( charset => 'none' ) );
my @urls = map { $_->{'Url'} } @{ $data->{d}->{results} };

my @za;
for my $i ( 0 .. $#urls ) {
    my $trz  = "www.";
    my $host = URI->new( $urls[$i] )->host;
    $host =~ s/$trz//g;
    push( @za, $host );
}
于 2013-05-13T02:54:40.407 回答
1

作为记录,这为我解决了这个问题(CentOS):

# yum install perl-Crypt-SSLeay

于 2015-07-10T17:43:33.317 回答
0

我遇到了同样的情况。在我使用 'yum' 安装 perl 后,运行 perl 脚本时仍然出现错误。

$ sudo yum install perl             
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management
...

最终我做了这些,并且它有效。

$ lwp-request https://google.com/

It returned an error message .. (LWP::Protocol::https not installed)

$ sudo rpm -ivh ~/perl-LWP-Protocol-https-6.07-4.el8.noarch.rpm

$ lwp-request https://google.com/

它返回了一个 HTML 页面。

我的 perl 脚本可以正常运行。

(我的系统是:

$ cat /etc/os-release PRETTY_NAME=Red Hat Enterprise Linux 8.0 )

于 2020-06-01T19:45:40.810 回答