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

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

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

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

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に関連する人気のQ&A

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

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

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

Q
の場所は?

CGIでデータを受け渡しするアンケートを作っています。html中に書く<form method=post action="***.cgi">~</form>“~”の場所についてですが質問項目を全て挟まなくてはいけませんか?実は、チェックボックスの「最大2つまで回答可」という部分をJavascriptでチェック個数を超えてチェックした時点でアラートが出るようにしてます。その記述中にすでに<form>~</form>タグを制限をかけたい質問に置いているので、質問全体を<form method=post action="***.cgi">~</form>でくくると入れ子になってしまいます。大丈夫ですか?

Aベストアンサー

<form method=post action="***.cgi" name="form1">~</form>
にする。つまり「最大2つまで回答可」という部分だけをonclickでJavascriptを呼び出したらいいと思います。

QCGI(Perl)とHTMLについて

CGI初心者です、Perlの知識は皆無です。
質問は2つあるのですが・・・

1、CGIのページを例えば画像を呼び出すようにHTMLで指定できるのでしょうか?
画像であれば<img src=".../AAA.gif">ですが、こんな感じでCGIのページ自体をHTMLの指定した枠に呼び出すことはできるのでしょうか。

2、CGIページのカスタマイズ
現在、CGIレスキューさんからダウンロードしたファイルをカスタマイズしています。
条件指定ができる検索データベースです。
設置と動作確認はできたのですが、思うようにレイアウトできないでいます。
Perl記述中にテーブル(HTML)を挿入すると、プルダウンメニューから選択項目が飛び出してしまうのです。

(おおざっぱに記述すると)
print <<"---HTML---";

あいうえお<select name="aiueo" size=1>
---HTML---

forseach $i (@AIUEOs) { print "<option value=\$i\"$pref_selected{$i}>$i</option>\n";}

print <<"---HTML---";
</select>
<p>
(略)
---HTML---
こんな感じです、変数の部分は変えてます。

ずっと上の方で、
@AIUEOs = ("あああ", "いいい", "ううう", "えええ", "おおお");
と、変数が定義されてるようです。

名称かきく「プルダウンメニューA」
名称あいうえお「プルダウンメニューB」
要は、「 」の部分を揃えたい(縦に整列)のですが、うまくいきません。プルダウンメニューが飛び出してしまいます。
2段目のHTML記述部分がなぜ閉じタグから始まっているのかもよくわからないです。

端折ってますので、分かりにくいと思いますが、コメントいただける方、よろしくお願いします。

CGI初心者です、Perlの知識は皆無です。
質問は2つあるのですが・・・

1、CGIのページを例えば画像を呼び出すようにHTMLで指定できるのでしょうか?
画像であれば<img src=".../AAA.gif">ですが、こんな感じでCGIのページ自体をHTMLの指定した枠に呼び出すことはできるのでしょうか。

2、CGIページのカスタマイズ
現在、CGIレスキューさんからダウンロードしたファイルをカスタマイズしています。
条件指定ができる検索データベースです。
設置と動作確認はできたのですが、思うようにレイアウトで...続きを読む

Aベストアンサー

再び回答しにきました。
1. iframeについて
iframeタグにはそれ自身のサイズを指定するwidth(幅) と height(高さ)の属性があります。
また、スクロールに関しても、scrolling=noとすることでスクロールバーの表示もコントロールできます。
<iframe src="hoge.cgi" width="50%" height="200" scrolling=no></iframe>

2. select周りについて
ようやくお悩みの部分がわかってきました。
純粋なHTMLなら理解されているようですね。

ならば、「foreach $i (@PREFs) 以下の部分は selectタグのoption部分にあたる部分である」という風に考えてください。

<<"---HTML---"; 部分をまたがっても構わないのです。</select>の部分も含めてテーブルにしてしまってください。

要は、perlって言語を使ってはいますが、結局はHTMLを書いているのです。

今回のプログラムをブラウザで実行させて、
画面に出した状態でソースを表示してみると分かりますが、
perlはhtmlを動的に書き出しているのであって、
結局はprintなどで書き出されるhtmlがページのレイアウトを決めます。

したがって、<<"---HTML---"; 部分をまたがってても、最終的に出力されるhtmlが正しければよいのです。

再び回答しにきました。
1. iframeについて
iframeタグにはそれ自身のサイズを指定するwidth(幅) と height(高さ)の属性があります。
また、スクロールに関しても、scrolling=noとすることでスクロールバーの表示もコントロールできます。
<iframe src="hoge.cgi" width="50%" height="200" scrolling=no></iframe>

2. select周りについて
ようやくお悩みの部分がわかってきました。
純粋なHTMLなら理解されているようですね。

ならば、「foreach $i (@PREFs) 以下の部分は selectタグのoption部...続きを読む

QCGI/Perlという本はありますがCGI/PHPという本はないのはなぜですか?

アマゾンで調べると表題でCGI/Perlという本はありますがCGI/PHPという本はないのはなぜですか?

Aベストアンサー

なぜそのような書籍が無いのか結論から申し上げると「需要が無い」からです。
その理由はPHPとCGIの動作に起因し、PHP利用の最大のメリット(?なのでしょうか?)であるHTML組み込みなど利用できなくなるからです。

動作の概略(あくまで概略なので細かくするとキリがありません)を示しますと(右に長いのでテキストエディタなどにコピペしてみていただくと見やすいかと思います)

CGIの動作
 ブラウザ-[INTERNET]->Webサーバー -[CGI]-> システム:処理言語{Perl/C/Ruby...etc.}+プログラム:処理結果 -[CGI]-> Webサーバー -[INTERNET]->ブラウザ

PHPの動作
 ブラウザ-[INTERNET]->Webサーバー:PHP:処理結果 -[INTERNET]->ブラウザ

PHPを単体で処理できるようにインストール設定すればPHPをCGIとして利用することも可能です。当然、利用範囲がCGIの域を出なくなり、PHPとしてのメリットがなくなってしまいます。
そのような非効率的な運用利用をする方はほとんどいないので書籍にしても需要が無いと思います(何らかの事情で必要な方なら、WebサーバとCGIがしっかり理解できていれば簡単に実現できるかと思います)。

ちなみに、代表的なWebサーバApacheは外部組み込み機能を使ってPerlを「PHPの動作」と同じ動きをさせることができます。
そちらは「CGI」の範疇ではなく「Webサーバー構築」の分野ですのでそういった書籍を参考にしてください。

なぜそのような書籍が無いのか結論から申し上げると「需要が無い」からです。
その理由はPHPとCGIの動作に起因し、PHP利用の最大のメリット(?なのでしょうか?)であるHTML組み込みなど利用できなくなるからです。

動作の概略(あくまで概略なので細かくするとキリがありません)を示しますと(右に長いのでテキストエディタなどにコピペしてみていただくと見やすいかと思います)

CGIの動作
 ブラウザ-[INTERNET]->Webサーバー -[CGI]-> システム:処理言語{Perl/C/Ruby...etc.}...続きを読む

QPerlのCGIでフォームのテキスト配列をPerlで取得するには?

フォームで通常は同じ名前のデータを取得することは無いのですが
表計算のように同じ名前の場合、データの取り出し方がわかりません。
以下、通常の1件の場合のソースです。


#!/usr/bin/perl

$| = 1;

use strict;
our %in;

use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
require 'jcode.pl';
require 'cgi-lib.pl';
#

#-----分岐-----

&ReadParse;

# 配列でない場合
my $namae = $in{'namae'}
print "$namaeで名前が1件表示される";
# これをフォームで namaeが配列になった場合、
#<input type="text" name ="namae">
#<input type="text" name ="namae">
#<input type="text" name ="namae">
# のような場合、3件取得する場合

exit;

__END__

フォームで通常は同じ名前のデータを取得することは無いのですが
表計算のように同じ名前の場合、データの取り出し方がわかりません。
以下、通常の1件の場合のソースです。


#!/usr/bin/perl

$| = 1;

use strict;
our %in;

use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
require 'jcode.pl';
require 'cgi-lib.pl';
#

#-----分岐-----

&ReadParse;

# 配列でない場合
my $namae = $in{'namae'}
print "$namaeで名前が1件表示される";
# これをフォームで namaeが...続きを読む

Aベストアンサー

パラメータのデコード処理で使用するモジュールによって、やり方は変わってきますが、cgi-lib.pl と CGI.pm の場合は下記のようになります。

cgi-lib.pl :
 対象のパラメータが収納された変数を \0 を区切り文字として分割する。

CGI.pm :
 リストコンテキストで値を受け取る。


例) cgi-lib.plを使う場合 ----------------------------
require "cgi-lib.pl";

&ReadParth; # デコード処理
@hoge = split(/\0/, $in{hoge}); # \0 で分割
------------------------------------------------

例) CGI.pmを使う場合 --------------------------------
use CGI;

$query = new CGI; # 新しいCGIオブジェクトの作成
@hoge = $query->param('hoge'); # パラメータhogeの内容の受け取り
------------------------------------------------

参考URL:http://www.futomi.com/lecture/form/cgilib.html#3.2,http://member.nifty.ne.jp/hippo2000/perltips/Cgi.htm#FETCHING_THE_VAL

パラメータのデコード処理で使用するモジュールによって、やり方は変わってきますが、cgi-lib.pl と CGI.pm の場合は下記のようになります。

cgi-lib.pl :
 対象のパラメータが収納された変数を \0 を区切り文字として分割する。

CGI.pm :
 リストコンテキストで値を受け取る。


例) cgi-lib.plを使う場合 ----------------------------
require "cgi-lib.pl";

&ReadParth; # デコード処理
@hoge = split(/\0/, $in{hoge}); # \0 で分割
---------------------------------------...続きを読む

Qperl/cgiでjpeg画像のクリック座標をcgiパラメータに渡すには

perl/cgiで表示したjpegの画像のクリックした点の座標位置を次にジャンプするページにcgiパラメータとして渡したいのですがどのようにすれば良いでしょうか?画像全体を<input type="button" src="画像ファイル" name="$test" value="返答">のようにすればよいのかもしれませんが、座標をパラメータ渡しする方法がわかりません。perl/cgiだけでは無理であれば、javascriptでcgiに渡すためのヒントでも構わないのですが。。。
ご存知の方がいたらご教示ください。

Aベストアンサー

「画像ボタン」という手も。
<form ~>
<input type=image name="AAA" height=100 width=100 src="xxx.gif">
</form>

参考URL:http://tohoho.wakusei.ne.jp/html/input.htm


このカテゴリの人気Q&Aランキング

おすすめ情報