Perl 无法将未定义的值用作filehandle引用

Perl 无法将未定义的值用作filehandle引用,perl,libcurl,Perl,Libcurl,首先,我搜索了论坛,没有找到我的问题。 我正在运行安装了Perl5.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;

首先,我搜索了论坛,没有找到我的问题。 我正在运行安装了Perl5.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
这里的任何帮助都将不胜感激

谢谢

Ben

以下位置有错误代码:

print ("Success ".$response_code);
请参阅文档:由于使用括号时解析参数的方式,第一个参数将被解释为filehandle,这不是您想要的。在代码中,括号是不必要的;只需传递一个连接的字符串,或者更好,避免连接并传递字符串列表:

print 'Success ', $response_code;
此外,请始终包括使用严格;使用警告;在您编写的每个脚本的顶部。您将发现,许多错误会突出显示,否则可能会隐藏相当长的一段时间,并且在您捕获错误时,在不得不询问堆栈溢出之前,这也节省了每个人的时间

以下位置存在错误代码:

print ("Success ".$response_code);
my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);
请参阅文档:由于使用括号时解析参数的方式,第一个参数将被解释为filehandle,这不是您想要的。在代码中,括号是不必要的;只需传递一个连接的字符串,或者更好,避免连接并传递字符串列表:

print 'Success ', $response_code;
此外,请始终包括使用严格;使用警告;在您编写的每个脚本的顶部。您将发现,许多错误会突出显示,否则可能会隐藏相当长的一段时间,并且在您捕获错误时,在不得不询问堆栈溢出之前,这也节省了每个人的时间

my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);
您已声明$response\u body,但尚未为其赋值。如果你把它做成一个字符串,我想这会起作用

my $response_body = "";
也就是说,我不能确定,因为我无法重现错误。也许安装新版本的模块也会有所帮助

您已声明$response\u body,但尚未为其赋值。如果你把它做成一个字符串,我想这会起作用

my $response_body = "";
也就是说,我不能确定,因为我无法重现错误。也许安装更新版本的模块也会有所帮助。

代替:

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

如果您查看文档中实际安装的WWW Curl版本,我想您会看到它传递的是一个文件句柄,而不是标量引用

或者,升级WWW-Curl

还请注意-W通常不可取;通常,模块会禁用特定范围的警告,大写字母W开关会阻止这种情况。使用-w代替或仅使用警告;对于您自己的代码,您已经在这样做了。

代替:

my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);
#!/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 做:

如果您查看文档中实际安装的WWW Curl版本,我想您会看到它传递的是一个文件句柄,而不是标量引用

或者,升级WWW-Curl

还请注意-W通常不可取;通常,模块会禁用特定范围的警告,大写字母W开关会阻止这种情况。使用-w代替或仅使用警告;对于您自己的代码,您已经在这样做了

#!/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 输出为:

Success 200

你在哪里收到错误?@Kevin在scraper.pl第15行;很抱歉错误发生在第15行。。。my$return\u code=$curl->perform;顺便提一下我使用的代码是使用Carp::Always逐字逐句运行的,并获得错误的完整堆栈跟踪。perl-MCarp::始终是_script.ply,您在哪里收到错误?@Kevin在scraper.pl第15行;很抱歉错误发生在第15行。。。my$return\u code=$curl->perform;顺便提一下我使用的代码是使用Carp::Always逐字逐句运行的,并获得错误的完整堆栈跟踪。perl-MCarp::始终是_脚本。谢谢您的输入。。。一个真正的业余错误:@Bnjmn:如果那一行永远不会被执行,那就不会::p@David-如你所见,社区在问题发生之前就解决了问题;我同意打印‘成功’、$response_code;是一种更好的形式,但帕伦斯真的会导致错误吗?一个简单的perl-We'my$val=bar\n;打印foo.$bar;'在Cygwin上对我来说很好。所以我不想成为一个痛苦的人,但我按照Ether的建议进行了更改,不幸的是仍然收到了相同的错误:感谢您的输入。。。一个真正的业余错误:@Bnjmn:如果那一行永远不会被执行,那就不会::p@David-如你所见,社区在问题发生之前就解决了问题;我同意打印‘成功’、$response_code;是一种更好的形式,但帕伦斯真的会导致错误吗?一个简单的perl-We'my$val=bar\n;打印foo.$bar;'我在Cygwin上工作得很好。所以我不想成为一个痛苦的人,但我按照Ether的建议进行了更改,不幸的是仍然收到了相同的错误:感谢您的回复,我知道perl在变量初始化方面特别慷慨,所以您提出的修复方案并没有解决问题。我还下载了最新版本

我的perl解释器也是最近发布的,因为论坛上以前的帖子报告了旧版本perl的问题。快速更新,当我将$response_body更改为空字符串时,解释器错误会更改并显示Bad filehandle:在该注释的scraper.pl第15行,$curl->setopt是否可能期望filehandle作为其第二个参数,而不是标量的引用?如果你不介意,试试这个:打开我的$fh,“>”,\$response\u body or die$$curl->setoptCURLOPT_WRITEDATA,$fh;编辑:文档暗示这不重要。@Hugmeir:但他检查的是最新的文档,而不是他拥有的版本的文档。4.11至少需要一个文件句柄,而不是标量引用。感谢您的响应,我知道perl在变量初始化方面特别慷慨,因此您提出的修复方案并没有解决这个问题。我还下载了最新版本的Curl模块,并确保我的perl解释器也是最新版本的,因为论坛上以前的帖子报告了旧版本perl的问题。快速更新,当我将$response_body更改为空字符串时,解释器错误会更改并显示Bad filehandle:在该注释的scraper.pl第15行,$curl->setopt是否可能期望filehandle作为其第二个参数,而不是标量的引用?如果你不介意,试试这个:打开我的$fh,“>”,\$response\u body or die$$curl->setoptCURLOPT_WRITEDATA,$fh;编辑:文档暗示这不重要。@Hugmeir:但他检查的是最新的文档,而不是他拥有的版本的文档。4.11至少需要一个文件句柄,而不是标量引用。谢谢d5e5,您已经解决了这个问题。非常感谢您的帮助。这篇文章已被降级为建议的解决方案,因为它代表了一个有点尴尬的解决方案,但它仍然提供了预期的结果,因此我投了赞成票。谢谢Bnjmn。在我发布上述内容后,我看到ysth在4分钟前发布了一个答案,我投了赞成票,因为它包含了一个解释。另外,我还没有看到随WWW::Curl::Easy一起安装的Curl.pm文件,它比包含Easy.pm的Curl文件夹高一级。它包含使用各种方法的示例,包括执行。谢谢d5e5,您已经解决了该问题。非常感谢您的帮助。这篇文章已被降级为建议的解决方案,因为它代表了一个有点尴尬的解决方案,但它仍然提供了预期的结果,因此我投了赞成票。谢谢Bnjmn。在我发布上述内容后,我看到ysth在4分钟前发布了一个答案,我投了赞成票,因为它包含了一个解释。另外,我还没有看到随WWW::Curl::Easy一起安装的Curl.pm文件,它比包含Easy.pm的Curl文件夹高一级。它包含了使用各种方法的示例,包括执行。。。当我指定的解决问题的解决方案仍然不受欢迎时,为什么社区会选择支持关于该解决方案的评论?@Bnjmn:我猜,因为另一个解决方案为您提供了一个解决方案,让您阅读了错误的文档,而不是解释您阅读了错误的文档?另外,使用curl将某些内容写入临时文件有点奇怪。感谢您的澄清。我同意使用临时文件并不理想,因为wget是一种更直接的方法。我会相应地调整我认可的解决方案。只是问。。。当我指定的解决问题的解决方案仍然不受欢迎时,为什么社区会选择支持关于该解决方案的评论?@Bnjmn:我猜,因为另一个解决方案为您提供了一个解决方案,让您阅读了错误的文档,而不是解释您阅读了错误的文档?另外,使用curl将某些内容写入临时文件有点奇怪。感谢您的澄清。我同意使用临时文件并不理想,因为wget是一种更直接的方法。我将相应地调整我认可的解决方案。