はじめまして、いつもphpをつかっててperlの知識がない者です。
perlの中にHTML部分を記入するとコードが読みにくくなるので別ファイル(テンプレート)として切り離したいのです。
そのとき、たとえば掲示板のように、ループ部分があっても、そのテンプレートがつかえるようにしたいのですが、そのような、スクリプトをご存知の方いらっしゃいましたら、どうか教えてください。
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

Antsさんこんばんは。

掲示板ソフトではそういう目的のために定番になっている手法があります。
モジュールがなくても大丈夫です。おそらくモジュールも同じようなことをやっているはずです。
例えば次のようなファイルをtemplate.htmlという名前で保存します
****************************************************

<html>
<head>
<title><!--title--></title>
<meta http-equiv="Content-Type" content="text/html; charset=<!--charset-->">
<meta http-equiv="Pragma" content="no-cache">
</head>

<body bgcolor="#<!--bgcolor-->" text="#<!--textcolor-->">
<h1><font color="#<!--fontcolor-->"><!--owner-->さんの掲示板</b></font></h1>
<!--begin-->番目から<!--end-->番目までの記事を表示しています<br>

<!--message-->

<hr>
<form action="BBS.cgi">
<input type="hidden" name="Next" value="<!--nextpage-->">
<input type="submit" value="次のページへ">
</form>
</body>
</html>

******************************************************************

そしてスクリプトの中で$title,$charset,$bgcolor,$textcolor等の変数を用意しておき

*****************************************************************

open (IN,"template.html");
print "Content-type: text/html\n\n";
while(<IN>){
  s/<!--title-->/$title/;
  s/<!--charset-->/$charset/;
   ・
   ・
   ・
 s/<!--message-->/$message/;
   ・
   ・
   ・
 s/<!--nextpage-->/$nextpage/;
 print ;
}

*******************************************************************
と置き換えていけばお望み通りのことができます。
ただし$messageの部分は1行ではすまないのでこの部分はスクリプトであらかじめ作ってやる必要があります。
例えばログファイルLOG.txtが
投稿者名:投稿日:内容
という書式で記録してあるとすれば

******************************************************************

open (INC,"LOG.txt");
$message="";
while(<INC>){
 ($name,$day,$mes)=split(':',$_);
  $message = "$message" .
"<table>\n
<tr><td>$name</td><td>$day</td></tr>\n
<tr><td colspan="2">$mes</td><tr>\n
</table><br>\n";
}

*****************************************************************
などとやります。leaz024さんが紹介されているモジュールも上に書いたようなルーチンをパッケージ化したものだと思われます。
なお上のスクリプトはささっと書いたのでコマンドのつづり間違い等があるかも知れませんがご容赦下さい。
    • good
    • 0
この回答へのお礼

なるほど、$messageの部分にあらかじめループ部分を入れておくのですね。
あとは変数<!--変数-->部分をおきかえてやればいいのですね。
<!--変数-->といったフォーマットにしているのは僕みたいにドリームウェーバーなどのソフトを使っている人にとって大助かりです。

oodaikoさんありがとうございました。
早速試してみます。

お礼日時:2001/12/07 23:07

HTML::Templateモジュールを使うと、簡単に実現することができます。


下記サイトで勉強してみてはいかがでしょうか。

参考URL:http://member.nifty.ne.jp/hippo2000/perltips/htm …
    • good
    • 0
この回答へのお礼

ありがとうございます。
まさに私の探していたものです。

モジュールがレンタルサーバーで使えるか?など勉強しなければいけない部分がありますが、やってみます。
がんばります。

お礼日時:2001/12/07 00:49

>そのとき、たとえば掲示板のように、ループ部分があっても、そのテンプレートがつかえるようにしたいのですが、そのような、スクリプトをご存知の方いらっしゃいましたら、どうか教えてください。



そのような汎用のスクリプトはしらないのですが…。
例えばこんな風にしたらどうでしょう?

template1 : ページのヘッダー部分(掲示板であればタイトル部分ぐらいまで)
tepmlate2 : 繰り返し部分
template3 : ページのフッター部分

このように3分割しておけば、かなり汎用的に使えるはずです。
プログラム内ではまずヘッダー部分のテンプレートを使い、続いて繰り返し処理ではtemplate2を使う、最後にtemplate3から生成したデータを出力すればお望みの動作になると思います。

しかし、この設計だとページ内で複雑にTABLEタグが入り組んでるような構造だと使えないかもしれません。
    • good
    • 0
この回答へのお礼

なるほど、
完全なHTMLとしない方法ですね。
ドリームウェーバーなどのHTMLソフトを使いたいのでできればさけたいのですが、、
でも逆に、こうやったほうが、さくさく動きやすいのでしょうね。

複雑にループっていうのはたぶんないと思います。
ループのネストは無いです。

ありがとうございました。
もうちょっと検討してみます。

お礼日時:2001/12/06 10:50

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCGIの中で出力するテキスト内容をhtml側で表示する方法。

htmlからCGIファイルを呼び出すと、そのCGIは動作はしているようですが、
print等でhtml形式で文字出力させている部分は、ブラウザ内に表示されません。
今やって失敗している方法です。どのようにするのが良いか教えて頂ければ幸いです。

1.CGIスクリプト(Perlで記述)を用意... test.cgi
-----------------------------------------------------
#!/usr/bin/perl
print "Content-type:text/html; charset=shift_jis\n\n";
print <<__EOD;
<html lang="ja">
<head>
<title>TITLE</title>
</head>
<div align=center>
<a>テスト1</a><br>
<a>テスト2</a><br>
</div><br>
</body></html>
__EOD

open(OUT,">a.tmp") || die "$!";
print OUT "aaaaa\n";
close(OUT);
-----------------------------------------------------


2.htmlを用意 ... test.html
-----------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<title>HTML TEST</title>
</head>
<body>
<script src="http://xxx/CGI/test.cgi"></script>
</body>
</html>
-----------------------------------------------------

上記のとき、動作として、

◆ブラウザからCGIのパス(http://svr1/CGI/test.cgi)に直接アクセスした場合、
「テスト1」「テスト2」の文字が表示され、a.tmpファイルも作成されている。

◆ブラウザからhtml(http://svr1/test.html)にアクセスした場合、ブラウザ画面は何も表示されない
(真っ白となる)が、a.tmpファイルは作成されている。

のようになってしまいます。

後者のようにして、htmlからCGIファイルを呼び出すと、そのCGIは動作はしているようですが、
print等でhtml形式で文字出力させている部分は、ブラウザ内に表示されません。

以上、よろしくお願い致します。

htmlからCGIファイルを呼び出すと、そのCGIは動作はしているようですが、
print等でhtml形式で文字出力させている部分は、ブラウザ内に表示されません。
今やって失敗している方法です。どのようにするのが良いか教えて頂ければ幸いです。

1.CGIスクリプト(Perlで記述)を用意... test.cgi
-----------------------------------------------------
#!/usr/bin/perl
print "Content-type:text/html; charset=shift_jis\n\n";
print <<__EOD;
<html lang="ja">
<head>
<title>TITLE</title>
</head>...続きを読む

Aベストアンサー

<script src="http://xxx/CGI/test.cgi"></script>としているなら
perlで出力するヘッダーは
print "Content-Type: application/x-javascript\n\n";
としないとならないでしょう。

perlではjavaScript構文を出力します。

例えばhtmlでは・・
<BODY>
<SCRIPT TYPE="Text/Javascript" LANGUAGE="Javascript">
<!--
document.write ("<SCRIPT TYPE=\"text/JavaScript\" SRC=\"test.cgi\"></SCRIPT>");
// -->
</SCRIPT>
</BODY>

として、perlでは

#!/usr/bin/perl
print "Content-Type: application/x-javascript\n\n";
print "document.write('<A HREF=\"other.html\">てすと</A>');";

てな感じです。

<script src="http://xxx/CGI/test.cgi"></script>としているなら
perlで出力するヘッダーは
print "Content-Type: application/x-javascript\n\n";
としないとならないでしょう。

perlではjavaScript構文を出力します。

例えばhtmlでは・・
<BODY>
<SCRIPT TYPE="Text/Javascript" LANGUAGE="Javascript">
<!--
document.write ("<SCRIPT TYPE=\"text/JavaScript\" SRC=\"test.cgi\"></SCRIPT>");
// -->
</SCRIPT>
</BODY>

として、perlでは

#!/usr/bin/perl
print "Content-Type: appli...続きを読む


人気Q&Aランキング