3
#!/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 行的未定义值上调用方法“标题”。

我应该怎么办?

非常感谢

4

2 回答 2

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;
于 2012-11-07T12:18:25.493 回答
1

变量声明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(推荐点击链接)

于 2012-11-07T12:19:53.010 回答