2016-08-18 22 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)テンプレートツールキットでは本当に複雑なことができますが、通常はそうではありません。単純な[ループ](http://template-toolkit.org/docs/manual/Directives.html#section_Loop_Processing)の代わりに '[%PERL%]'ブロックを使用するのはなぜですか? – ThisSuitIsBlackNot

+0

私は言語としてテンプレートの代わりに言語としてperlが好きです。覚えておくことも少なくなります。 –

+1

これは、テンプレートエンジンを起動する前に、できるだけPerlコード*で行うべき理由です。単純なテンプレートでさえ、デバッグするのに苦労することがあります。任意のPerlコードを追加すると、はるかに複雑になります。 – ThisSuitIsBlackNot

答えて

2

[% PERL %]のドキュメントはかなり明確です。

Perlコードは、Template :: Perlパッケージで評価されます。 $contextパッケージ変数には、現在のTemplate :: Contextオブジェクトへの参照が含まれています。これは、Template Toolkitの機能にアクセスして、他のテンプレート、プラグイン、フィルタなどを処理するために使用できます。詳細はTemplate::Contextを参照してください。

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

$stash変数は、テンプレート変数を管理する最上位レベルのスタッシュオブジェクトへの参照を含んでいます。これにより、変数値を取得して更新することができます。詳細は、Template::Stashを参照してください。それはハッシュのよう$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 

は、それが聞こえます。

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

$stash%varsの内容よりも多く含まれていることに注意してください。)

関連する問題