【发布时间】:2015-03-23 14:58:59
【问题描述】:
我正在创建一个带有线程的脚本,所以我必须重建带有线程支持的 perl (perl5.20)。 由于我已经重建 perl,我有一个错误:
Can't locate object method "query_form" via package "LWP::UserAgent"
我尝试重新安装 LWP::UserAgent、LWP::Simple、URI,但它们是最新的(根据 cpan)。
错误代码:
#!/usr/bin/env perl
package get_xml;
use strict;
use warnings;
use Curses;
use LWP::Simple;
use LWP::UserAgent;
use MIME::Base64;
use URI;
use URI::http;
use HTTP::Request::Common;
use parse_xml;
# ...
sub write_conv_thread{
my ($window, $rows, $username, $url, $ua) = @_;
while(1){
$$url->query_form( # line 43
"heartbeat" => '0',
"conv" => 0,
"username" => "$username",
"active" => 0
);
my $xml = $$ua->get($url);
my @conv = get_conv($xml);
print_all_lines($window, $rows, @conv);
$$window->refresh();
sleep(5);
}
}
1;
以及确切的错误消息:Thread 1 terminated abnormally: Can't locate object method "query_form" via package "LWP::UserAgent" at get_xml.pm line 43.
调用函数的代码:
#!/usr/bin/env perl
use strict;
use warnings;
use Curses;
use LWP::Simple;
use LWP::UserAgent;
use MIME::Base64;
use URI;
use threads;
use get_xml;
use post_xml;
# ... initialization of Curses windows ...
# $chat_win is a curse, $row is a number
my $server_endpoint = "...";
my $ua = LWP::UserAgent->new;
my $url = URI->new( "$server_endpoint/index.php" );
my $thread = threads->new(\&get_xml::write_conv_thread, \$chat_win, $row-4,"...", \$url, \$ua);
$thread->detach();
我该怎么做才能让perl找到对象方法?
感谢您的回答。
【问题讨论】:
-
很简单,
query_form不是LWP::UserAgent中的方法。它确实存在于URI模块中。如果没有看到您调用write_conv_thread的代码,就无法帮助您更改它。 -
我对@987654329@ 感到困惑。如果
$url是一个对象,它应该已经是一个标量引用。在这种情况下,看起来您的代码引用了引用。那是对的吗?不幸的是,这里没有多少。不知道你是怎么构造的$$url,所以看不出是什么类。 -
我已经编辑了我的问题以添加调用 write_conv_thread 的代码。 $url 是一个参考。
-
我们需要调用query_form()的代码...大约get_xml.pm的第43行...
-
关于您的代码的一些题外话: 1) 您的 GUI 库可能不支持在一个线程中运行并从另一个线程更新。您需要将要显示的数据发送到显示线程并让它更新窗口。 2)你不应该在线程之间共享对象,也没有必要在这里共享 URL 对象或 UA 对象。在您的线程中创建它们。 3) 参考文献是什么?
标签: multithreading perl libwww-perl