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行目の未定義の値でメソッド「headers」を呼び出すことはできません。

私は何をすべきか?

どうもありがとう

4

2 に答える 2

2

あなたはそれを忘れます、あなたは最初に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;
于 2012-11-07T12:18:25.493 に答える
1

の変数宣言myは次のように構成されています。

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

(ブラケット部分はオプションです。)

を実行するだけでmy $name、新しい変数を宣言しますが、まだ割り当てられていないため、値はundefです。式の内部では、定義されている変数にアクセスできないことに注意してください。

undef eq (my $undef)はtrueと評価されます。新しい変数の値はです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 に答える