Не могу использовать неопределенное значение в качестве ссылки на дескриптор файла - PullRequest
1 голос
/ 13 декабря 2010

Во-первых, я искал на форумах и не нашел именно мою проблему. Я использую Ubuntu с установленным Perl 5.10.

Я получаю следующую ошибку после выполнения моего скрипта:

 "Can't use an undefined value as filehandle reference at scraper.pl line 17"

Вот мой сценарий ....

#!/usr/bin/perl -W
use strict;
use warnings;

use WWW::Curl::Easy;


my $curl = WWW::Curl::Easy->new;

$curl->setopt(CURLOPT_HEADER, 1);
$curl->setopt(CURLOPT_URL, 'http://something.com');


my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);

my $return_code = $curl->perform;

if ($return_code == 0)
{
  my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
  print ("Success ".$response_code);
}
else
{
  # Error Code
  print ("An error occured: ".$return_code." ".$curl->strerror($return_code)." ".$curl->errbuf."\n");
}

# EOF

Любая помощь здесь будет высоко ценится.

Спасибо

Ben

Ответы [ 5 ]

6 голосов
/ 14 декабря 2010

Вместо:

my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);

do:

my $response_body = '';
open(my $fileb, ">", \$response_body);
$curl->setopt(CURLOPT_WRITEDATA,$fileb);

Если вы посмотрите документацию для версии WWW-Curl, которую вы фактически установили, я думаю, вы увидитеон передает дескриптор файла, а не скалярную ссылку.

В качестве альтернативы, обновите WWW-Curl.

Также обратите внимание, что -W обычно не рекомендуется;часто модули отключают предупреждения для определенной области, а заглавная буква W предотвращает это.Вместо этого используйте -w (или просто use warnings; для своего собственного кода, который вы уже делаете).

2 голосов
/ 14 декабря 2010
#!/usr/bin/perl
use strict;
use warnings;

use WWW::Curl::Easy;
use File::Temp qw/tempfile/;

my $response_body = tempfile();

my $curl = WWW::Curl::Easy->new;

$curl->setopt(CURLOPT_HEADER, 1);
$curl->setopt(CURLOPT_URL, 'http://yiddele.com/categoryindex.aspx');

#$curl->setopt(CURLOPT_WRITEDATA,\$response_body);
$curl->setopt(CURLOPT_WRITEDATA, \$response_body);

my $return_code = $curl->perform;

if ($return_code == 0)
{
  my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
  print ("Success ".$response_code);
}
else
{
  # Error Code
  print ("An error occured: ".$return_code." ".$curl->strerror($return_code)." ".$curl->errbuf."\n");
}

# EOF

Вывод:

Success 200
0 голосов
/ 09 февраля 2017
        use Data::Printer ;
        use URI::Encode qw(uri_encode uri_decode);
        use JSON ();
        use JSON::Parse ':all' ;
        use WWW::Curl;
        use HTTP::Response ;

        use utf8 ;
        use Carp ;
        use Cwd qw ( abs_path ) ;
        use Getopt::Long;

         use WWW::Curl::Easy;

         my $curl = WWW::Curl::Easy->new;
         $curl->setopt(WWW::Curl::Easy::CURLOPT_HEADER(),1);
         $curl->setopt(WWW::Curl::Easy::CURLOPT_URL(), 'https://www.pivotaltracker.com/services/v5/me?fields=%3Adefault');
         $curl->setopt(WWW::Curl::Easy::CURLOPT_HTTPHEADER() , ['X-TrackerToken: ' . $TOKEN]  );
         #$curl->setopt(WWW::Curl::Easy::CURLOPT_POST(), 1);

         # A filehandle, reference to a scalar or reference to a typeglob can be used here.
         my $response_body;
         $curl->setopt(WWW::Curl::Easy::CURLOPT_WRITEDATA(),\$response_body);

         # Starts the actual request
         my $ret = $curl->perform;


         if ($ret == 0) {

              print("Transfer went ok\n");
              my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
              # judge result and next action based on $response_code

              $response_body = HTTP::Response->parse($response_body);
              print("Received response: $response_body\n");
              p($response_body);
              my $json_data = $response_body->content ;

              $json_data = JSON->new->utf8->decode($json_data);
              p($json_data);

         } else {
             # Error code, type of error, error message
              print("An error happened: $ret ".$curl->strerror($ret)." ".$curl->errbuf."\n");
         }

        # my $cmd='curl -X GET -H "X-TrackerToken: ' . "$TOKEN" . '" "https://www.pivotaltracker.com/services/v5/me?fields=%3Adefault"' ;
        # my $json_str = `$cmd`;
        # p($json_str);
        # my $json_data = JSON->new->utf8->decode($json_str);
        # p($json_data);
0 голосов
/ 13 декабря 2010
my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);

Вы объявили $response_body, но не присвоили ему значение. Я предполагаю, что это сработает, если вы сделаете это строкой.

my $response_body = "";

Тем не менее, я не уверен, так как не могу воспроизвести ошибку. Возможно, установка более новой версии модуля тоже поможет.

0 голосов
/ 13 декабря 2010

Недопустимый код:

print ("Success ".$response_code);

Просмотрите документацию для print : из-за способа анализа аргументов при использовании скобок первый аргумент будет интерпретирован какбыть файловым дескриптором, который не , что вы намеревались.В вашем коде скобки не нужны;просто передайте объединенную строку, или, лучше, избегайте объединения и передайте список строк:

print 'Success ', $response_code;

Также, пожалуйста, , пожалуйста, всегда включайте use strict; use warnings; в начале каждый скрипт , который вы пишете.Вы обнаружите, что выделены многие ошибки, которые в противном случае могут оставаться скрытыми в течение довольно долгого времени, и это также экономит время каждого, когда вы улавливаете ошибку, прежде чем когда-либо запрашивать переполнение стека.:)

...