我正在编写一个脚本来将我的Stackoverflow活动源提取到网页中,它看起来像这样:
#!/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();
模板应迭代我的活动Feed(来自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();
答案 0 :(得分: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
对象没有items
元素,因为它只是几个实现的包装器(包括XML::RSS
)。模板不会获得XML::Feed
对象,它会得到一个简单的哈希引用,例如:
{ 'rss' => XML::RSS Object }
在散列引用中包装您的Feed会使编译器保留XML::Feed
对象,从而允许处理引擎在模板中找到feed.items
时执行所需的“魔术”。