Template.pm:在[%perl%]中访问传递的哈希

时间:2016-08-18 18:33:57

标签: perl templates

我知道如何在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 个答案:

答案 0 :(得分:2)

[% PERL %]的文档非常明确。

  

Perl代码在Template :: Perl包中进行评估。 $context包变量包含对当前Template :: Context对象的引用。这可用于访问Template Toolkit的功能以处理其他模板,加载插件,过滤器等。有关详细信息,请参阅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的文档中,将$stash视为哈希是安全的。

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

(请注意,$stash包含的内容多于%vars。)