Не могу запустить скрипт Perl на другом компьютере

Когда я пытаюсь запустить скрипт на моем втором компьютере, я получаю это сообщение:

искаженная строка JSON, ни массив, ни объект, ни число, ни строка, ни атом, со смещением символа 0
(до "LWP будет поддерживать htt...") в строке 21 iptest.pl, строка 2.

На моем первом компьютере скрипт работает нормально.

Строка 21:

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

Кто-нибудь знает в чем может быть проблема?

заранее спасибо

4 ответа

Решение

Я немного удивлен, что ошибка JSON - единственная ошибка, которую вы получаете. Но он содержит небольшой намек: "LWP будет поддерживать htt...". Могу поспорить, что в LWP отсутствует модуль, который должен иметь возможность устанавливать соединения https. Теперь у вас есть два варианта:

  1. Распечатать $response->content чтобы увидеть полное сообщение об ошибке.
  2. В командной строке сделайте что-то вроде lwp-request https://google.com/, Вы должны увидеть полное сообщение об ошибке.

Затем установите отсутствующий модуль.

И конечно: пожалуйста, пожалуйста, пожалуйста:

  • use strict а также use warnings
  • Очистите этот скрипт и выбросьте каждый useлиния вам не нужна: IO::Socket, LWP::Simple, YAML::Tiny.
  • Прочитайте документацию модулей, которые вы на самом деле используете. Чего вы пытаетесь достичь с LWP::UserAgent->new(keep_alive)? Подсказка: это не поможет процитировать keep_alive,

Некоторые вопросы:

  1. Всегда используйте use strict; use warnings;,
  2. Никогда не используйте $response->content, То, что он возвращает, бесполезно. Вместо этого используйте $response->decoded_content( charset => 'none'),
  3. Вам нужно chomp значения, которые вы получаете от STDIN.
  4. Вы никогда не должны использовать our если не принужден (например, our @ISA = хорошо) my следует использовать вместо
  5. my $format = '$format'; "$format" это глупый способ написания "\$format",

Для справки, это исправило проблему для меня (CentOS):

# yum install perl-Crypt-SSLeay

Я применил большинство изменений, предложенных икегами. Затем 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 );
}

Я попал в такую ​​же ситуацию. После того, как я использовал 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)

Другие вопросы по тегам