3

Stackoverflow アクティビティ フィードを Web ページにプルするスクリプトを作成しています。次のようになります。

#!/usr/bin/perl

use strict;
use warnings;

use XML::Feed;
use Template;

my $stackoverflow_id = 1691146;
my $stackoverflow_url = "http://stackoverflow.com/feeds/user/$stackoverflow_id";

my $template = <<'TEMPLATE';
[% FOREACH item = items %]
[% item.title %]
[% END %]
TEMPLATE

my $tt = Template->new( 'STRICT' => 1 )
  or die "Failed to load template: $Template::ERROR\n";

my $feed = XML::Feed->parse(URI->new($stackoverflow_url));

$tt->process( \$template, $feed )
  or die $tt->error();

テンプレートはアクティビティ フィード (からXML::Feed->items()) を反復し、それぞれのタイトルを出力する必要があります。このコードを実行すると、次のようになります。

var.undef error - undefined variable: items

それを機能させるには、process行を次のように変更する必要がありました。

$tt->process( \$template, { 'items' => [ $feed->items ] } )

メソッドTemplate::Toolkitを使用できないように見える理由を誰か説明できますか?XML::Feed->items()

私は似たような作業をしましたXML::RSS

my $rss = XML::RSS->new();
$rss->parse($feed);
$tt->process ( \$template, $rss )
    or die $tt->error();
4

1 に答える 1

3

ほんの少しの調整。

#!/usr/bin/perl -Tw

use strict;
use warnings;

use XML::Feed;
use Template;
use Data::Dumper;

my $stackoverflow_id = 1691146;
my $stackoverflow_url = "http://stackoverflow.com/feeds/user/$stackoverflow_id";

my $template = <<'TEMPLATE';
[% FOREACH item = feed.items() %]
[% item.title %]
[% END %]
TEMPLATE

my $tt = Template->new( 'STRICT' => 1 )
  or die "Failed to load template: $Template::ERROR\n";

my $feed = XML::Feed->parse(URI->new($stackoverflow_url));



$tt->process( \$template, { feed => $feed } )
  or die $tt->error();

テンプレートコンパイラは、キーと値が内部に格納されているプレーンなハッシュ参照を想定しています。XML::RSSオブジェクトを与えると、items要素があるので機能します。オブジェクトは、いくつかの実装(を含む)の単なるラッパーであるためXML::Feed、要素を持っていません。テンプレートはオブジェクトを取得せず、次のような単純なハッシュ参照を取得します。itemsXML::RSSXML::Feed

{ 'rss' => XML::RSS Object }

フィードをハッシュ参照でラップすると、コンパイラーはオブジェクトを保持し、処理エンジンがテンプレートで見つかったXML::Feedときに必要な「魔法」を実行できるようにします。feed.items

于 2012-12-16T03:48:38.877 に答える