【问题标题】:Perl Template Toolkit: get root variablePerl 模板工具包:获取根变量
【发布时间】:2013-04-30 20:40:02
【问题描述】:

问题的简短版本:

有没有办法从提供给流程调用的模板中获取 $var-hash(不是它的子变量)

my $tt = Template->new({
    VARIABLES => {
        version => 3.14,
        release => 'Sahara',
    },  
});

my $vars = {
    serial_no => 271828,
    i => 0
    c => 1
};

$tt->process('myfile', $vars);

长版:

从模板的角度来看 serial_no,i 和 c 是全局变量,但我也希望通过它们的父哈希访问它。

背景是我们将 xml 转换为哈希树。不同的(独立的)模板适用于该树的不同部分(不同级别)。子模板收集有关该树部分的一些附加信息。 现在我想在这个模板中使用子模板,但是一些模板在树的一个节点上工作

例子

A
+-Bs
  +- b1
     +- i
     +- c
  +- b2
     +- i
     +- c
  +- b3
     +- i
     +- c

这棵树被转换成一个哈希,直接作为 $vars 给出 模板 TA 工作整个哈希(模板看到变量 Bs) 模板 TB 在一个 B-Node 上工作,并且只获取这个节点(模板见 i anc c)

我想编写一个 BLOCK,它接受一个 B 节点并对其进行操作。 这个块应该可以从 TA 和 TB 使用,所以我正在寻找一种在不更改生成器脚本的情况下获得完整环境的方法。

【问题讨论】:

  • $tt->process('myfile', { root => $vars }) 怎么样?
  • 我尝试在脚本端添加 $vars->{varRoot} = $vars; 并将 varRoot 赋予子模板。 但是: 如果块通过向该哈希添加条目来更改 varRoot,则这些条目不能通过全局名称空间从模板访问,而只能通过 varRoot 访问。在模板处理后转储哈希表明哈希已正确更新,但似乎 ptk 确实以不同方式处理存储的根对象。

标签: perl template-toolkit


【解决方案1】:

使用[% PERL %] 块或使用Template::Plugin::Stash

测试

[% USE Stash %]
[% USE Dumper Indent = 1%]
<pre>[% Dumper.dump_html( Stash.stash() ) %]</pre>

未经测试

[% PERL %]
$stash->set( iamthestash => $stash ); ## or call your tree thing
[% END %]

【讨论】:

  • 这个插件似乎没有安装第二行给出了关于未定义变量的错误。似乎 perl 块无法从脚本环境访问变量
  • 即使使用 Stash 插件也不起作用。 Stash.stash().f='test'; 无效。该对象似乎是不可变的。
  • @vlad_tepesch 你需要安装Template::Plugin::Stash。例如:cpanm Template::Plugin::Stash希望这些信息在 8.5 年后仍然有用……当然,对其他人也有用。
猜你喜欢
  • 1970-01-01
  • 2011-12-26
  • 2011-12-26
  • 2012-12-23
  • 2014-01-08
  • 1970-01-01
  • 2013-03-13
  • 2011-10-05
  • 2013-06-15
相关资源
最近更新 更多