#!/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”。
我该怎么办?
非常感谢
答案 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
不可能(自动装箱除外)。
解决方案:
use strict; use warnings;
首先声明并初始化变量,然后在其上调用方法。
在这种特殊情况下,要检索内容类型,您可以
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
上的文档: