• ベストアンサー

HTML::Templateのループと配列のハッシュの作成

下記の?????の所にpushで配列のハッシュを作成しようと考えていましたが、うまくいきません。 下記のソース自体が的外れでしたら申し訳ございません。?????以外の場所も指摘して頂ければ幸いです。 よろしくお願い致します。 <TMPL_LOOP NAME="loop"> <TMPL_VAR NAME="one"><BR> <TMPL_VAR NAME="two"><BR> <TMPL_VAR NAME="three"><BR> </TMPL_LOOP> use HTML::Template; @data = ('aa<>ab<>ac','ba<>bb<>bc','ca<>cb<>cc'); foreach $xxx (@data) { my ($one,$two,$three) = split(/<>/,$xxx); ???????????????????? } my $template = HTML::Template->new(filename=>'sample.html'); $template->param(loop=>\@loop); print "Content-Type: text/html\n\n"; print $template->output;

  • Perl
  • 回答数3
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

HTML::Template についてはよく知りませんが、???... の部分は無名ハッシュを push すればよいように思います。 push @loop, { one => $one, two => $two, three => $three };

sfgfsherg
質問者

お礼

ありがとうございます、無事解決できました。 ですが、サブルーチンにしたところまた分からない所がでてきました。 もしよろしければこちらも見ていただければ幸いです。 http://oshiete1.goo.ne.jp/qa4953602.html この度は、ご回答ありがとう御座いました。

その他の回答 (2)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.3

多重投稿申し訳ありません。 一箇所間違えてました。 push(@aLP01,\%hTMP); は push(@aLP01,\%hTmp); としてください。 実際の動作確認していないので他にもあるかも・・・。 いちおう考え方の説明ということで許してやってください。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

スクリプト側はこんな感じかと思います。 use HTML::Template; @data = ('aa<>ab<>ac','ba<>bb<>bc','ca<>cb<>cc'); my %hDISP; my @aLP01; foreach $xxx (@data) { my ($one,$two,$three) = split(/<>/,$xxx); ## ???????????????????? my %hTMP; $hTmp{ONE} = $one; $hTmp{TWO} = $two; $hTmp{THREE} = $three; ## ???????????????????? push(@aLP01,\%hTMP); } $hDISP{LOOP}=\@aLP01; ## my $template = HTML::Template->new(filename=>'sample.html'); ## $template->param(loop=>\@loop); my $template = HTML::Template->new(filename => 'sample.html', 'die_on_bad_params' => 0); $template->param(\%hDISP); print "Content-Type: text/html\n\n"; print $template->output; --------------------------------------------- やり方はループ内にハッシュを作ってループ外の配列にリファレンスをプッシュしてゆきます。 そのループのリファレンスを一旦ハッシュに入れた方が、ループ外のテンプレート指定も出来ますので便利です。 タグの名前は、大文字で指定しましたが、初期のTemplateモジュールが大文字しか使えなかった頃の名残で、今でもHTMLのタグと区別するのに見やすいのでわたしは大文字をいまだに使っています。現在では区別しますのでテンプレート側とで調整してください。 'die_on_bad_params'は保険なんですが、意味はご自分でお調べください。

sfgfsherg
質問者

お礼

丁寧なご説明ありがとうございます。 非常に分かりやすく勉強になりました。 これ自体は解決できましたが、サブルーチンにしたところまた分からない所がでてきました。 もしよろしければこちらも見ていただければ幸いです。 http://oshiete1.goo.ne.jp/qa4953602.html この度は、ご回答ありがとう御座いました。

関連するQ&A

  • サブルーチンの返値に配列のハッシュ

    いつもお世話になっております。 HTML::Templateを使用する為、サブルーチンの返値に配列のハッシュを入れたいと思っていますが、うまくいきません。 また、myの使い方が分からず、返値までの方法も若干気になります。 よろしくお願い致します。 use HTML::Template; @loop = &loop_make('aa<>ab<>ac','ba<>bb<>bc','ca<>cb<>cc'); my $template = HTML::Template->new(filename=>'sample.html'); $template->param(loop=>\@loop); print "Content-Type: text/html\n\n"; print $template->output; exit; sub loop_make{ @aaa = (); foreach $xxx (@_) { ($one,$two,$three) = split(/<>/,$xxx); push @loop, { one => $one, two => $two, three => $three }; } return \@aaa; }

  • HTML::Templateの初歩的な質問

    HTML::Templateを使用してサイトを構築しようとしてるのですが、うまくいきません。 例1のようにしたいのですが、どこが間違っているかを指摘していただきたく書き込ませて頂きました。 ちなみに例2ではうまく作動しています。 よろしくお願い致します。 サンプルコード ★sample.html★ <TMPL_LOOP name=arr> <p><TMPL_VAR name=val></p> </TMPL_LOOP> ★例1★ my $template = HTML::Template->new(filename => 'sample.html'); @arr = [ {val=>'1'},{val=>'2'},{val=>'3'} ]; $template->param(arr => \@arr); print "Content-Type: text/html\n\n"; print $template->output; ★例2★ my $template = HTML::Template->new(filename => 'sample.html'); $template->param(arr => [ {val=>'1'},{val=>'2'},{val=>'3'} ] ); print "Content-Type: text/html\n\n"; print $template->output;

    • ベストアンサー
    • Perl
  • HTML::TemplateのTMPL_LOOPについて

    PerlモジュールのHTML::Templateを利用していますが、多重ループの書き方がわかりません。 以下のようなループがある場合、どのようにperlを記述したらいいでしょうか。 <TMPL_LOOP NAME=LOOPA> <TMPL_VAR NAME=title> <TMPL_LOOP NAME=LOOP_GUEST> <TMPL_VAR NAME=guest_name> </TMPL_LOOP> <TMPL_VAR NAME=time> </TMPL_LOOP> ドキュメントを見ると下記のように記述するようですが、下記を値それぞれではなく、配列を利用する場合にはどのように記述すれば良いでしょうか。 $template->param(LOOP => [ { name => 'Bobby', nicknames => [ { name => 'the big bad wolf' }, { name => 'He-Man' }, ], }, ], );

    • ベストアンサー
    • Perl
  • HTML::Templateでカレンダー出力したい

    Calendar::SimpleとHTML::Templateを利用しtableタグを使ったカレンダー表示を行いたいのですが、1週間ごとに<tr>タグで区切るループの記載の仕方がわかりません。 見本にした他所様のbaseサブルーチンでは1週間ごとに<tr>タグで区切られたきれいなカレンダー表示がされますが、myplanサブルーチンでは現状<tr>タグで区切る部分が作られていないため、日にちの数字が1週間ごとに区切られずにずらっと横並びとなってしまっている状態です。 Calendar::Simple http://perldoc.jp/docs/modules/Calendar-Simple-1.07/Simple.pod HTML::Template http://perldoc.jp/docs/modules/HTML-Template-2.6/HTML/Template.pod baseでの表示 日 月 火 水 木 金 土     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 現状のmyplanでの表示 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 use HTML::Template; use Calendar::Simple; local $cal = calendar; local @caps = qw( 日 月 火 水 木 金 土 ); local @wdays = qw( sunday monday tuesday wednesday thursday friday saturday ); #&base; &myplan; exit; sub base{ print "Content-type: text/html; charset=\"utf8\"\n\n"; print qq|<table>\n|; print qq|<tr>\n|; for (my $i = 0; $i < 7; $i++) { my $cap = $caps[$i]; my $wday = $wdays[$i]; print qq|<th class="$wday">$cap</th>\n|; } print qq|</tr>\n|; foreach my $week ( @$cal ) { print qq|<tr>\n|; for (my $i = 0; $i < 7; $i++) { my $mday = $week->[$i]; my $wday = $wdays[$i]; print qq|<td class="$wday">$mday</td>\n|; } print qq|</tr>\n|; } print qq|</table>\n|; }#end base sub myplan{ for (my $i = 0; $i < 7; $i++) { my %row_data; $row_data{cap} = $caps[$i]; $row_data{wday} = $wdays[$i]; push(@loop_data, \%row_data); } foreach my $week ( @$cal ) { for (my $i = 0; $i < 7; $i++) { my %row_data; $row_data{mday} = $week->[$i]; $row_data{wday} = $wdays[$i]; push(@loop_data_3, \%row_data); } } my $template = HTML::Template->new( filename => "html_template/calender.tmpl", ); $template->param( THIS_LOOP => \@loop_data, THIS_LOOP3 => \@loop_data_3 ); print "Content-type: text/html; charset=\"utf8\"\n\n"; print $template->output; }#end myplan ##calender.tmpl <html> <body> <table> <tr> <TMPL_LOOP NAME=THIS_LOOP> <th class="<TMPL_VAR NAME=wday>"><TMPL_VAR NAME=cap></th> </TMPL_LOOP> </tr> <tr> <TMPL_LOOP NAME=THIS_LOOP3> <td class="<TMPL_VAR NAME=wday>"><TMPL_VAR NAME=mday></td> </TMPL_LOOP> </tr> </table> </body> </html>

    • ベストアンサー
    • Perl
  • HTML::Templateの空行について

    HTML::Templateを利用しています。 テンプレート側で<TMPL_IF>を使用すると、不要な改行が入ってしまい、困っています。 ■テンプレートサンプル---------------------------- <div> あああああああああああ </div> <TMPL_IF NAME="PATERN_A"> 出力パターン1<br> <TMPL_ELSE> 出力パターン2<br> </TMPL_IF> <TMPL_IF NAME="PATERN_B"> 出力パターン3<br> <TMPL_ELSE> 出力パターン4<br> </TMPL_IF> <div> いいいいい </div> ■出力結果---------------------------- <div> あああああああああああ </div>                    ←空行 出力パターン2<br>                    ←空行                    ←空行 出力パターン3<br>                    ←空行 <div> いいいいい </div> 実害はないのですが、この空行をなくすことはできないでしょうか。

    • ベストアンサー
    • Perl
  • スクロールバー項目ごとに、表示するものをかえる。

    こんにちは。 CGIでHTML::TEMPLATEをつかってプログラムをかいています。 そこで、スクロールバーを用いて、選択したものによって表示する内容を変えようと思っているのですが うまくいきません.私が現在書いたものはこのようなかんじです。 function filter(){ var tmp='<TMPL_VAR NAME=GETRIEBE> '; document.getElementById('waelen').innerHTML=tmp; } <form name="select"> <select name="waelen" onCharge="filter();"> <option value="werkstoff">werkstoff</option> <option value="getriebe">getriebe</option> </select> </form> <table><TMPL_LOOP NAME=ALLDATA> <tr><td><TMPL_VAR NAME=DATEI> </td> <span id="waelen"><td><TMPL_VAR NAME=WERKSTOFF> </td></span> ..... というふうに書いていっています。項目は本当はもう少しありますが。省略しました。 これを実装すると、スクロールバーから、項目を選択した際に、<TMPL_VAR NAME=WERKSTOFF>内容がかわるはずなのですが、 うまくいきません。最初の項目だけが、消されてしまいます。おそらく最初に画面を切り替えた時しか データがうけとれないのだとおもいます。 そこで、スクロールの項目を選ぶと、その項目に関連する内容が表示できたりできますか? ようするに、最初からHTMLで4パターンぐらいのテーブルを作っておき、 選択内容によって、コメントアウトをはずすような仕組みです。(そうしないと、HTMLテンプレートのせいでうまくデータがとれないきがしています。) なにか,いい方法があればよろしくお願いします。Javascriptに関する知識はあまりもっていないです。

  • 携帯用CGIフォームの修正(戻る)ボタンについて

    無料で配布されたCGIで携帯用のメールフォームを作っています。 フォームに入力後〔確認画面へ進む〕ボタンを押してエラーがあればフォームに自動で戻しエラー表示をしています。(入力内容を維持したまま戻されます) ここまではテンプレートでできました。 しかし、送信前の確認画面で、内容を修正するためのボタンがありません。 3つ作ったフォームの内の2つは携帯の戻るボタンで内容を維持したまま戻れたのですが、スクロールをしなければならない程縦長のフォームだけ、どういう訳か携帯の戻るボタンを押しても入力フォームに戻れないです。スクロールの上の方に上がるだけです。 そこで、確認画面に内容を修正するためのボタンを設置しようと考えているのですが、どのような記述をすれば良いのでしょうか? ※内容は維持したまま修正したいです。 確認画面のソースにはこのような記述があったのですがこれが関係していますでしょうか。 <!-- TMPL_LOOP NAME=loop_list --> <input type="hidden" name="<!-- TMPL_VAR NAME=key ESCAPE=HTML -->" value="<!-- TMPL_VAR NAME=value ESCAPE=HTML -->"> <!-- /TMPL_LOOP --> 大変お手数ですが教えていただけると助かります。 宜しくお願い致します。

    • ベストアンサー
    • CGI
  • 無名配列からハッシュを作りたいのですが・・・

    $VAR1 = [ 'No', 'a', 'i', 'u', 'e', 'o', ]; #VAR1と同じ数の<>区切りの下記のようなデータを読み込み配列に代入 --List----------------------- 1<>あ<>い<>う<>え<>お<> ------------------------- foreach(0..$#List){ @Array=split(/<>/,$List[$_]); } 最終的なイメージは print "$a{No}"; >1 print "$a{a}"; >a となるよう、上記VAR1の無名配列の値をキーに、読み込んだ<>区切りのデータを関連付けて表示させるようにしたいのです。 foreach my$var(@$VAR1){ ...ここをどうすれば配列の値をハッシュのキーとして作成出来るのか頭を悩ませてます。 } 先輩方のお知恵をお借りできませんでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • Smartyのテンプレート内で、連想配列をassignする方法はあるのでしょうか?

    Smartyのテンプレート内で、連想配列をassignする方法はあるのでしょうか? もし、なんらかご存知の方いらっしゃいましたら教えて下さい。 #最悪{php}を使うとかでも構いませんので。。 ■現在 .php ---- $ary = array('id' => 1, 'name' => 'buta'); $sm = new Smarty(); $sm->assign('ary', $ary); ---- .tpl ---- ID={ $ary.id }<br> NAME={ $ary.name }<br> ---- ■希望 .tpl ---- { assign var='ary' value=array('id' => 1, 'name' => 'buta') } ⇒ エラー ID={ $ary.id }<br> NAME={ $ary.name }<br> ---- よろしくお願い致します。

    • ベストアンサー
    • PHP
  • iなぜかnputのvalueが利きません

    inputタグのvalueに<TMPL_VAR aaa>というのを入れているのですがなぜか表示されません。 <input type="text" name="text" value="<TMPL_VAR text>" size="150"><br> <TMPL_VAR text>には文字列が入っています。なぜでしょうか?

専門家に質問してみよう