3

我正在编写一个脚本来将我的 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();

模板应该迭代我的活动提要(来自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对象没有items元素,因为它只是多个实现(包括XML::RSS)的包装器。模板不会得到一个XML::Feed对象,它会得到一个普通的哈希引用,比如:

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

将您的提要包装在哈希引用中会使编译器保留对象,从而允许处理引擎在模板中找到XML::Feed对象时执行所需的“魔术” 。feed.items

于 2012-12-16T03:48:38.877 回答