Multithreading perl可以';通过包LWP::UserAgent查找对象方法查询表单

Multithreading perl可以';通过包LWP::UserAgent查找对象方法查询表单,multithreading,perl,libwww-perl,Multithreading,Perl,Libwww Perl,我正在用线程创建一个脚本,所以我必须用线程支持重建perl(perl5.20)。 由于我重新生成了perl,因此出现了一个错误: 无法通过包“LWP::UserAgent”找到对象方法“查询表单” 我试图重新安装LWP::UserAgent、LWP::Simple、URI,但它们是最新的(根据cpan) 错误代码: #!/usr/bin/env perl package get_xml; use strict; use warnings; use Curses; use LWP::Simpl

我正在用线程创建一个脚本,所以我必须用线程支持重建perl(perl5.20)。 由于我重新生成了perl,因此出现了一个错误:

无法通过包“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;
确切的错误消息是:
线程1异常终止:无法通过get_xml.pm第43行的包“LWP::UserAgent”找到对象方法“query_form”。

调用函数的代码:

#!/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找到对象方法

谢谢您的回答。

UA(对UA的引用)被分配到
$url
而不是
$UA


我对原因的最佳猜测(因为您没有提供给出错误的实际代码):
$window
$rows
$username
没有提供,导致(引用)UA成为第四个参数。

很简单,
查询表单
不是
LWP::UserAgent
中的方法。它确实存在于
URI
模块中。如果没有看到调用
write\u conv\u thread
的代码,就不可能帮助您更改它。我被
$$url
弄糊涂了。如果
$url
是一个对象,那么它应该已经是一个标量引用。在本例中,看起来您的代码采用了引用的引用。对吗?不幸的是,这里没有太多。我不知道你是如何构造
$$url
,所以我看不出它是什么类型的类。我已经编辑了我的问题,添加了调用write\u conv\u thread的代码$url是一个引用。我们需要调用查询表单()的代码。。。大约在get_xml.pm的第43行……关于代码的一些离题注释:1)您的GUI库可能不支持在一个线程中运行并从另一个线程更新。您需要将要显示的数据发送到显示线程,并让它更新窗口。2) 您不应该在线程之间共享对象,这里也不需要共享URL对象或UA对象。在线程中创建它们。3) 引用是怎么回事?如果您可以从线程中登录,转储@uu的值,您应该能够看到调用中缺少了一些内容。
warn($):(定义($[$])?:“[undef]”用于0..$#
,但仅查看代码可能更容易。错误是由于缺少参数造成的@ikegami:你的一行代码让我想起了为什么有人说perl很难阅读(我还有很多东西要学:)。