0

2 台目のコンピューターでスクリプトを実行しようとすると、次のメッセージが表示されます。

文字オフセット 0 で、配列、オブジェクト、数値、文字列、アトムのいずれでもない不正な形式の JSON 文字列
(「LWP will support htt...」の前) iptest.pl の 21 行目、2 行目。

私の最初のコンピューターでは、スクリプトは正常に動作します。

21 行目:

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

問題が何であるかを知っている人はいますか?

前もって感謝します

4

5 に答える 5

3

JSON エラーが発生する唯一のエラーであることに少し驚いています。ただし、「LWP は htt をサポートします...」という小さなヒントが含まれています。LWP には、https 接続を確立するために必要なモジュールが欠けているに違いありません。次の 2 つのオプションがあります。

  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. chompSTDIN から取得した値が必要です。
  4. our強制されない限り、決して使用しないでください(例our @ISA= ok)。my代わりに使用する必要があります。
  5. my $format = '$format'; "$format"ばかげた書き方"\$format"です。
于 2013-05-13T02:27:36.573 に答える
1

私は池上が提案した変更のほとんどを適用しました。その後、perl は残りの問題を修正するための適切なエラー メッセージを表示してくれました。今はうまくいっているようです。以前はうまくいかなかった理由を尋ねないでください。あなたのコードは奇妙で、正確に何が間違っていたのかを言うのは難しい. strict と warnings を使用すると、より良いコードを書く必要があります。わかりやすくするために、適切な名前のサブルーチンをいくつか追加することもできます。

#!/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 に答える