【问题标题】:perl Can't locate object method query_form via package LWP::UserAgentperl 无法通过包 LWP::UserAgent 定位对象方法 query_form
【发布时间】: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 的代码,就无法帮助您更改它。
  • 我对@9​​87654329@ 感到困惑。如果$url 是一个对象,它应该已经是一个标量引用。在这种情况下,看起来您的代码引用了引用。那是对的吗?不幸的是,这里没有多少。不知道你是怎么构造的$$url,所以看不出是什么类。
  • 我已经编辑了我的问题以添加调用 write_conv_thread 的代码。 $url 是一个参考。
  • 我们需要调用query_form()的代码...大约get_xml.pm的第43行...
  • 关于您的代码的一些题外话: 1) 您的 GUI 库可能不支持在一个线程中运行并从另一个线程更新。您需要将要显示的数据发送到显示线程并让它更新窗口。 2)你不应该在线程之间共享对象,也没有必要在这里共享 URL 对象或 UA 对象。在您的线程中创建它们。 3) 参考文献是什么?

标签: multithreading perl libwww-perl


【解决方案1】:

(引用)UA 被分配给 $url 而不是 $ua

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

【讨论】:

  • 如果您可以从您的线程登录,转储 @_ 的值,您应该能够看到您的调用中缺少某些内容。
  • warn("$_: ".( defined($_[$_]) ? "<<$_[$_]>>" : "[undef]" )) for 0..$#_;,虽然只是看代码可能更容易。
  • 错误是由于缺少参数。 @ikegami:您的代码行让我想起了为什么说 perl 很难阅读(而且我有 很多 需要学习 :))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多