読者です 読者をやめる 読者になる 読者になる

HTML::Template で LOOP の中で VAR NAME="hoge" を呼び出す方法

HTML::Template

CGIでサイト作るときなど、よく使わせてもらっています。
HTML::Template


例えば

   $template->param(EMPLOYEE_INFO => [ 
                                       { name => 'Sam', job => 'programmer' },
                                       { name => 'Steve', job => 'soda jerk' },
                                     ]
                   );

こういうデータ構造を作ると

   <TMPL_LOOP NAME=EMPLOYEE_INFO>
      Name: <TMPL_VAR NAME=NAME> <br>
      Job:  <TMPL_VAR NAME=JOB>  <p>
   </TMPL_LOOP>

こんな感じで、書くことができます。


結果は

   Name: Sam
   Job: programmer

   Name: Steve
   Job: soda jerk

こんな感じ。

やりたかったこと

このLOOPの中で、配列"EMPLOYEE_INFO"とは全く関係ない変数を呼び出したかった。
こんな感じ

   $template->param(EMPLOYEE_INFO => [ 
                                       { name => 'Sam', job => 'programmer' },
                                       { name => 'Steve', job => 'soda jerk' },
                                     ]
                   );
   $template->param(TEST => "test");

こういうデータ構造で、

   <TMPL_LOOP NAME=EMPLOYEE_INFO>
      <TMPL_VAR NAME=TEST> Name: <TMPL_VAR NAME=NAME> <br>
      <TMPL_VAR NAME=TEST> Job:  <TMPL_VAR NAME=JOB>  <p>
   </TMPL_LOOP>

こういうこと


ところがこれが動かない・・・。
なぜだ・・・。

の内側では、 から利用できる変数だけが入ります

このLOOPとは一つのスコープのような扱いらしいです。
つまり、LOOPという構造の中に、別のスコープの変数は来るな、ってことですね。


そこで、このLOOPの中にLOOP以外の変数を呼び出したい場合は、変数をグローバル化しなければなりません。


それをするには

    my $template = HTML::Template->new(filename =>'test.tmpl',
                                       global_vars => 1);

こんな風にすればOK。


勉強になりましたm(_ _)m