プロが教える店舗&オフィスのセキュリティ対策術

ビルダーで作成したhtmlを、perlの中へ入れたいのですが、書籍を見てますと、print "<~~~>"\n;
と、いう具合にしなさいとの指示があります。
しかし、一律にprintを各行に付けてもエラーが出ます。なぜでしょう?
諸先輩方のperlを見ると、printなんて、あんまり使用してないようにおもえるのですが、もっと手っ取り早く組み入れる方法があるのでしたら教えてください。

htmlでは各dataを、*****.cgiへ引き渡してるのですが、
<form method="POST" action="*****.cgi">
の文は、cgiの中へ入れても問題ないでしょうか?

初心者なので、でたらめな質問かもしれませんがよろしくお願いいたします。

A 回答 (6件)

分かっている事だと思いますが、CGIの構成から説明しますね。


CGIでは、各処理系→HTML書き出しの順に処理されます。
当然、HTMLを書き出している最中に、変数処理をさせても問題ありません。
というより、こうする事でインタラクティブなページ表示を可能にするわけです。

さて本題です。
ビルダーで作ったHTMLを埋め込む・・・これが一番効率的には良いですね。
様々な文献には、print"~"の中にHTMLを埋め込む書式が基本的になっています。
ところが、このやり方だと少し面倒な事があります。
例えば、HTMLにある"(ダブルコーテーション)は、print"~"と同じ扱いになり、そのまま記述すると、当然エラーを起こします。
これを回避する為に「 \" 」と記述します。
これを延々やらなくてはなりません。
また、print"~"の構文は、HTML一行ずつ書き出していくと言う事なので、大変面倒ですね。

そこで、良い構文がありますので、使ってください。
(<>はタグの変換処理をされるといけないので全角にしてます)

print <<"EOF";
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
EOF

print<<"EOF";

EOF
の間にHTMLを埋め込めば良いわけです。
これはどう言うことかというと、print<<"EOF";~EOFを
単なるテキスト文として扱われます。
EOFはラベルなので、分かり易いものにすればいいです。
例えばEOFの代わりに、END_HTML等・・・
しかも、この中に変数を埋め込んで扱う事も可能です。
例えば、
PRINT<<"EOF";
<TABLE>
<TR>
<TD colspan="2" align="center">$bbs_title</TD>
</TR>
EOF
こうする事で、$bbs_titleの変数の内容が表示されます。

あと、<form method="POST" action="*****.cgi">
の文は、cgiの中へ入れても問題ないでしょうか?
の答えですが、当然HTMLなので、CGIの中に埋め込む事は
可能です。

こう考えると簡単ですよ。
CGIで様々に加工して、最終的にHTMLが吐き出され、ブラウザで表示される。と言う事は、HTMLを埋め込んで、必要な箇所にPerlで処理をした変数を埋め込む事で、インタラクティブなHPを作る事が出来る。

この回答への補足

早速の回答ありがとうございます。
上記の通り、print<<"EOF";~EOFで囲ってみたのですが、下記のエラーがでました。なぜでしょう・・・(涙)

Can't find string terminator "EOF" anywhere before EOF at C:\www\test2.cgi line 15.

ちなみに15行目は、
print<<"EOF";
です。

補足日時:2001/07/03 15:58
    • good
    • 0

 確認しました(笑)



 このエラーは、EOM の前かあとにスペースやタブなどが来ていると発生します。
 最後の EOM は、それだけで1行が終わっていなければならず、それ以外の文字が同じ行にきてはいけません。
 カッコわるいですがインデントしてはいけないのです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
解決いたしました。
なんてお礼を言っていいやら(涙)
ほうとうにありがとうございます。

お礼日時:2001/07/04 11:28

print<<"EOF";でエラーがでましたか。


これだけだと何とも言えないんですが、
HTMLの後のEOFはラベルなので、スペースは空けないで下さい。
良くあるのは、プログラムを見やすくするために、階段式に記述していたりすると、ラベルも同じようにスペースを空けてしまったりします。
print<<"EOF";自体には、特に問題はないと思うので
考えられるのはその辺かな。
あと、気を付けなければならないのは、
Content-type: text/htmlの記述は必須ですが、
必ず<HTML>とは一行空行が必要になります。

この時、print<<"EOF";の中に入れてしまっても良いですが、間違えやすい場合は、この箇所だけ

print "Content-type: text/html\n\n";
を使って、あとはprint<<"EOF";を使うと良いでしょう。

今出ているエラーは構文エラーなので、一行ずつ丹念にチェックすると、必ず解決します。
多分、printにからむ部分は、上記の2点位だと思うんですが・・・・
ソースコードが見れれば直ぐに判るんですけどね。
もし良かったら、print文のあたりのソースコード記載してくれませんか。

この回答への補足

どうしてもうまくいきません。ソースは以下の通りです。

#!/user/bin/perl

open(IN,"data.csv");
#flock IN,2;
@line = <IN>;
#flock IN,8;
close(IN);

$cnt = 0;
foreach(@line){
($sina[$cnt],$jpg[$cnt],$pr[$cnt],$kakaku[$cnt]) = split(/\,/,$_);
$cnt++;
}
#以上の変数を以下のhtmlに埋め込む予定

print "Content-type: text/html\n\n";
print<<"EOF";

<HTML>
<HEAD>
<meta http-equiv="Content-type" content="text/html; charset=shift_jis">
<META name="GENERATOR" content="IBM HomePage Builder 2001 V5.0.0 for Windows">
<TITLE>あいむ</TITLE>
<STYLE type=text/css>
<!--
input ,textarea ,select {color:#333333; background-color: #ffffff; border-top: #888888 1px solid; border-right: #888888 1px solid; border-left: #888888 1px solid; border-bottom: #888888 1px solid;}
a{text-decoration:none;color:#004488;}
a:hover{text-decoration:underline; color:#004488;}
body ,tr ,td {font-size:10 pt;}
big {font-size:12 pt;}
small {font-size:8 pt;}
//-->
</style>
</HEAD>
<BODY BACKGROUND="" BGCOLOR="#ffffff" TEXT="#333333" LINK="#004488" VLINK="#888888">
<center>
<form method="POST" action="r_formmail.cgi">
<TABLE width="651">
<TBODY>
<TR>
<TD width="172" height="148">
<TABLE width="161">
<TBODY>
<TR>
<TD align="center" height="22" bgcolor="#00ff00">■てれび■</TD>
</TR>
<TR>
<TD align="center" height="106" bgcolor="#00ff00"><IMG src="fukui/am/sumpl.jpg" width="126" height="84" border="0" align="middle"></TD>
</TR>
</TBODY>
</TABLE>
</TD>
<TD width="296" colspan="2" height="148">
<TABLE width="423">
<TBODY>
<TR>
<TD colspan="2" bgcolor="#00ff00" valign="top" width="500" align="left" height="88"><BR>
・そば、天ぷら、<BR>
 小鉢(日替わり)、ビール<BR>
</TD>
</TR>
<TR>
<TD height="40" bgcolor="#00ff00" colspan="2" width="500" valign="middle" align="center">¥1200    ご注文 <SELECT name="data4">
<OPTION value="0"> 0</OPTION>
<OPTION value="テレビ×1"> 1</OPTION>
<OPTION value="テレビ×2"> 2</OPTION>
<OPTION value="テレビ×3"> 3</OPTION>
<OPTION value="テレビ×4"> 4</OPTION>
<OPTION value="テレビ×5"> 5</OPTION>
<OPTION value="テレビ×6"> 6</OPTION>
<OPTION value="テレビ×7"> 7</OPTION>
<OPTION value="テレビ×8"> 8</OPTION>
<OPTION value="テレビ×9"> 9</OPTION>
<OPTION value="テレビ×10">10</OPTION>
<OPTION value="テレビ×11" selected>11</OPTION>
<OPTION value="テレビ×12">12</OPTION>
</SELECT></TD>
</TR>
</TBODY>
</TABLE>
</TD>
</TR>
</TBODY>
</TABLE>
<BR>
<table><tr><th bgcolor="#888888">
<b><font color="#eeeeee"><big>■ お届け先 ■</big></font></b>
</tr>
<tr><td>
<br>
<ul>
<li>以下の項目に記入してください。(必須)と書かれた項目には必ずご記入願います。
<li>「送信」ボタンを押すと内容確認画面に移ります。
</ul>
<FONT color=#404080><B>【お名前】</B></FONT>まとめてのご注文は代表者のお名前をどうぞ。<br>
<INPUT type="text" name="data1" size="32" value="" onblur="this.style.backgroundColor='';" onfocus="this.style.backgroundColor='#f7f7f7'; "> <br>
<FONT color=#ff4422><B>※</B></FONT><SMALL>必須項目です。必ず記入してください</SMALL><BR>
<BR>
<FONT color="#404080"><B>【電話番号】</B></FONT>ハイホン(-)は記入しないでください。<BR>
<INPUT type="text" name="tel" size="24" onblur="this.style.backgroundColor='';" onfocus="this.style.backgroundColor='#f7f7f7'; "><BR>
<FONT color="#ff4422"><B>※</B></FONT><SMALL>必須項目です。必ず記入してください<BR>
</SMALL><br>
<FONT color=#404080><B>【住所】</B></FONT>市町村から番地までご記入ください。<br>
<INPUT type="text" name="data2" size="44" value="" onblur="this.style.backgroundColor='';" onfocus="this.style.backgroundColor='#f7f7f7'; "> <br>
<FONT color=#ff4422><B>※</B></FONT><SMALL>必須項目です。必ず記入してください</SMALL><BR>
<br>
<FONT color=#404080><B>【住所2】</B></FONT><FONT color="#000000">会社・施設・部署・ビル名・階数等</FONT><br>
<INPUT type="text" name="data3" size="77" value="" onblur="this.style.backgroundColor='';" onfocus="this.style.backgroundColor='#f7f7f7'; "> <br>
<FONT color=#ff4422><B>※</B></FONT><SMALL>配達先が住宅以外の場合、なるべく詳しく記入してください。 【例】○○株式会社 1F事務所</SMALL><BR>
<HR align=center color=#444444 width="100%">
<center>
<input type="submit" value="送信する" name="submit">
 <input type="reset" value="リセット" name="reset">
</CENTER>
</td></tr></table>
</FORM></center>
</body>
</html>
EOF

補足日時:2001/07/04 08:03
    • good
    • 0

もう皆さんが大事なところは説明されてますので補足だけ。


deagleさん、burnさんが説明されているHTMLの埋め込みに使っている手法はヒアドキュメントと言います。
ご自分で調べられるときはこの項目で引いてみてください。
    • good
    • 0
この回答へのお礼

すみません。解決しました♪
どうもご迷惑かけてすみませんでした。
ありがとうございます。

お礼日時:2001/07/04 11:26

 print を各行の頭につけるだけでは駄目です(笑) HTMLを Perl に埋め込むのは、Perl の使い方としては中級レベルの作業なので、まずは「文字列を記述する際のルール」を復習した方がいいでしょう。



 文字は必ずダブルクォート(”)で囲まれていなければならないので、その作業もしなければいけません。また、文字列内にダブルクォートがくると、その前には¥をつけなければならないという決まりもあります。
 そんなこと考えててると面倒なので、もっと簡単な方法があります。

print <<EOM;
Content-type: text/html

<html>
以下略
EOM

 このように、「<<EOM」という文字列を使うと、その次の行から EOM までをすべてまとめて出力してくれます。
 このとき、「Content-type: text/html」とその次の行の空きは省略してはいけません。これはMIMEヘッダーというもので、Perl からHTMLを出力するときには必ず必要な物です。

 それから、Perl はあくまで「HTMLテキストを出力しているだけ」であり、フォームの処理は閲覧者側のパソコンがやることなので、出力してはいけない文字は存在しません。

この回答への補足

早速の回答ありがとうございます。
上記の通り、print<<EOM;~EOMで囲ってみたのですが、下記のエラーがでました。なぜでしょう・・・(涙)

Can't find string terminator "EOM" anywhere before EOF at C:\www\test2.cgi line 15.

ちなみに15行目は、
print<<EOM;
です。

補足日時:2001/07/03 16:12
    • good
    • 0

 私もそれほど詳しくないので間違えてるかもしれないですが、ビルダーで作ったhtmlをperlに入れるとは???


ハイパーテキストをプログラムに埋め込んで何をするのですか?CGIにhtmlの要素を付け加えるならそれなりのプログラムを書き足すのが筋で楽じゃないかな?と思うのですが
    • good
    • 0

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