无法在search.pl第10行的未定义值上调用方法“headers”

时间:2012-11-07 11:24:20

标签: perl mojolicious

#!/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)');

get error:无法在search.pl第10行的未定义值上调用方法“headers”。

我该怎么办?

非常感谢

2 个答案:

答案 0 :(得分:2)

你忘记了,你需要先从tx获得资源。

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

my $res = $tx->res;

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

答案 1 :(得分:1)

my的变量声明的结构如下:

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

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

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

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

$ 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. 首先声明并初始化变量,然后在其上调用方法。

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

    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(建议使用链接)