我知道如何在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?";
我需要知道如何获取这个,以便我可以迭代哈希键并做其他事情。可能是非常明显的答案,但我已经尝试了所有我能想到的并且失败了。
答案 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
。)