不能将未定义的值用作文件句柄引用

时间:2010-12-13 20:02:14

标签: perl libcurl

首先,我搜索了论坛,但没有找到我的问题。 我正在运行安装了perl 5.10的Ubuntu。

执行我的脚本后,我收到以下错误:

 "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

非常感谢任何帮助。

谢谢,

5 个答案:

答案 0 :(得分:6)

取代:

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

做的:

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

如果您查看了实际安装的WWW-Curl版本的文档,我认为您会看到它传递文件句柄,而不是标量参考。

或者,升级WWW-Curl。

另请注意,-W通常不建议;通常模块会禁用特定范围的警告,而大写的W开关会阻止这种情况。使用-w代替(或只是use warnings;代码,您已经在使用自己的代码。)

答案 1 :(得分:2)

#!/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

答案 2 :(得分:0)

有错误的代码:

print ("Success ".$response_code);

查看print的文档:由于在使用括号时解析参数的方式,第一个参数将被解释为文件句柄,你想要的是什么。在您的代码中,括号是不必要的;只是传递一个连接的字符串,或者更好,避免连接并传递一个字符串列表:

print 'Success ', $response_code;

此外,请 始终在您编写的每个脚本的顶部添加use strict; use warnings;。您将发现许多错误被突出显示,否则可能会隐藏很长一段时间,并且它还可以在您遇到错误之前节省每个人的时间,然后再询问Stack Overflow。 :)

答案 3 :(得分:0)

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

您已声明$response_body,但尚未为其指定值。我认为如果你把它变成一个字符串就行了。

my $response_body = "";

那说,我无法确定,因为我无法重现错误。也许安装较新版本的模块也会有所帮助。

答案 4 :(得分:0)

        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);