【问题标题】:Can't call method "headers" on an undefined value at search.pl line 10无法在 search.pl 第 10 行的未定义值上调用方法“标题”
【发布时间】:2012-11-07 11:24:20
【问题描述】:
#!/usr/bin/perl
use Mojo::Base -strict;
use Mojo::DOM;
use Mojo::Util qw(decode);
use Mojo::UserAgent;
my $uri = 'http://efremova.info/word/statja.html';
my $sel = 'td#centerCnt ol li';
my $charset = 'windows-1251';
my $tx = Mojo::UserAgent->new()->get($uri);
my $res->headers->content_type("text/html; charset=$charset");
my $dom = $res->dom;
my $el = $dom->at($sel) or die "selector $sel not found";
$el->find('span.nobr')->each(sub { $_->replace($_->text) });
my $text = $el->text;
binmode(STDOUT, ':encoding(UTF-8)');

得到错误:无法在 search.pl 第 10 行的未定义值上调用方法“标题”。

我该怎么办?

非常感谢

【问题讨论】:

  • mojo 重新标记为 mojolicious,因为这是您在此处使用的 Web 框架的名称。

标签: perl mojolicious


【解决方案1】:

你忘了,你需要先从 tx 获取 res。

my $tx = Mojo::UserAgent->new()->get($uri);

my $res = $tx->res;

$res->headers->content_type("text/html; charset=$charset");
my $dom = $res->dom;

【讨论】:

    【解决方案2】:

    my 的变量声明结构如下:

    my [TYPE] NAME [ATTRIBUTES] [= EXPRESSION]
    

    (括号中的部分是可选的。)

    当您只执行my $name 时,您声明了一个新变量但尚未分配给它,因此值为undef。请注意,在表达式内部,正在定义的变量不可访问。

    表达式undef eq (my $undef) 的计算结果为真:新变量的值为undef。 实际上,声明本身就是表达式,返回左值。

    $ perl -Mstrict -E'my $three = my $foo + 2 + (my $bar=1); say $three'
    3
    

    在非严格模式下,您可以说my $weird = $weird + 2,其计算结果为2。在严格模式下,除非您有一个同名的全局变量,否则这是不允许的。

    您的语法 my $undefined->method_call 有点不寻常,计算结果为 (undef)->method_call,这不可能(自动装箱除外)。

    解决办法:

    1. use strict; use warnings;

    2. 先声明并初始化你的变量,然后调用它的方法。

    在这种特殊情况下,要检索内容类型,您可以这样做

    my $content_type = $tx->res->headers->content_type;
    

    设置内容类型没有任何意义。要检索 DOM,您可以这样做

    my $dom = $tx->res->dom;
    

    如果你喜欢长方法链,你可以这样做

    my $el =
       Mojo::UserAgent->new()
         ->get($uri)
         ->dom
         ->at($sel)
       or die "..."
    ;;
    

    Mojo 模块的文档:

    http://metacpan.org/pod/Mojo::Transaction::HTTP

    http://metacpan.org/pod/Mojo::UserAgent

    my 上的文档:

    http://perldoc.perl.org/functions/my.html(推荐点击链接)

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 2016-04-15
      • 2012-08-24
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      相关资源
      最近更新 更多