2016-08-18 41 views
0

我知道如何访问我在Template.pm迷你语言中传递的散列,但是如何在[%PERL%]碎片中访问它?我错过了显而易见的。Template.pm:在[%perl%]中访问传递的散列

%vars = (perldefined => "abc", somehash => { a => 'aa', b => 'bb' }); 
$template = Template->new({ INTERPOLATE => 1, EVAL_PERL => 1}); 

,现在一些例子

$in1 = 'a plain variables "[% perldefined %]". a hashcontent variable "[% somehash.a %]". good.bye'."\n"; 
($template->process(\$in1, \%vars)) or die "bad"; 

作品。

print "\niterating over Hash in Template code\n"; 
$in1 = 'a plain variables [% perldefined %]. a hashcontent variable [% FOREACH key IN somehash.keys %] [% key %] => [% somehash.$key %] [% END %] good.bye..'."\n"; 
($template->process(\$in1, \%vars)) or die "bad"; 

工程。

print "\nHash print\n"; 
$in1 = 'a plain variables [% perldefined %]. [% somehash %] ] good.bye.'."\n"; 
($template->process(\$in1, \%vars)) or die "bad"; 

的作品。打印哈希引用。

,现在在那里我坚持:

print "\nHash print in Perl subcode, lack of knowledge making iterating impossible \n"; 
$in1 = 'a plain variables [% perldefined %]. [% PERL %] print somehash [% END %] good.bye.'."\n"; 
($template->process(\$in1, \%vars)) or warn "huh?"; 

我需要知道怎么去,这样我可以遍历哈希键和做其他事情。可能显而易见的答案,但我尽我所能想到和失败。

+1

能否请你告诉[你正在试图解决,而不是仅仅你决定该方法的实际问题?( http://meta.stackexchange.com/q/66377/234299)尽管使用Template Toolkit可以做很复杂的事情,但通常最好不要这样做。为什么'[%PERL%]'块而不是简单的[循环](http://template-toolkit.org/docs/manual/Directives.html#section_Loop_Processing)? – ThisSuitIsBlackNot

+0

因为我喜欢perl作为一种语言而不是Template作为一种语言。更少要记住。 –

+1

这正是您在调用模板引擎之前应该尽可能在Perl代码中执行的原因。即使是简单的模板也可能成为调试的痛点;当你开始添加任意的Perl代码时,事情变得更加复杂。 – ThisSuitIsBlackNot

回答

2

[% PERL %]的文档非常清晰。

Perl代码在Template :: Perl包中进行评估。包变量$context包含对当前Template :: Context对象的引用。这可用于访问模板工具包的功能来处理其他模板,加载插件,过滤器等。有关更多详细信息,请参阅Template::Context

[% PERL %] 
    print $context->include('myfile'); 
[% END %] 

$stash变量包含到管理模板变量顶层藏匿对象的引用。通过这个,变量值可以被检索和更新。有关更多详细信息,请参见Template::Stash

[% PERL %] 
    $stash->set(foo => 'bar'); 
    print "foo value: ", $stash->get('foo'); 
[% END %] 

所以,

$ tpage --eval_perl --define a=4 --define b=5 <<<' 
    [%- PERL -%] 
     print($stash->get("a"), "\n"); 
     print($stash->get("b"), "\n"); 
    [%- END -%] 
' 
4 
5 

从::藏匿的文件,这听起来像它的安全治疗$stash如哈希。

$ tpage --eval_perl --define a=4 --define b=5 <<<' 
    [%- PERL -%] 
     print("$stash->{a}\n"); 
     print("$stash->{b}\n"); 
    [%- END -%] 
' 
4 
5 

(注:$stash含有比%vars内容更多。)