首先,我搜索了论坛,但没有找到我的问题。 我正在运行安装了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
非常感谢任何帮助。
谢谢,
本
答案 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);