• ベストアンサー

ホームページビルダーで作ったhtmlを、perlの中に入れたい。

ビルダーで作成したhtmlを、perlの中へ入れたいのですが、書籍を見てますと、print "<~~~>"\n; と、いう具合にしなさいとの指示があります。 しかし、一律にprintを各行に付けてもエラーが出ます。なぜでしょう? 諸先輩方のperlを見ると、printなんて、あんまり使用してないようにおもえるのですが、もっと手っ取り早く組み入れる方法があるのでしたら教えてください。 htmlでは各dataを、*****.cgiへ引き渡してるのですが、 <form method="POST" action="*****.cgi"> の文は、cgiの中へ入れても問題ないでしょうか? 初心者なので、でたらめな質問かもしれませんがよろしくお願いいたします。

  • CGI
  • 回答数6
  • ありがとう数2

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

  • ベストアンサー
  • burn
  • ベストアンサー率65% (25/38)
回答No.3

分かっている事だと思いますが、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を作る事が出来る。

Iam2888
質問者

補足

早速の回答ありがとうございます。 上記の通り、print<<"EOF";~EOFで囲ってみたのですが、下記のエラーがでました。なぜでしょう・・・(涙) Can't find string terminator "EOF" anywhere before EOF at C:\www\test2.cgi line 15. ちなみに15行目は、 print<<"EOF"; です。

その他の回答 (5)

noname#25358
noname#25358
回答No.6

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

Iam2888
質問者

お礼

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

  • burn
  • ベストアンサー率65% (25/38)
回答No.5

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文のあたりのソースコード記載してくれませんか。

Iam2888
質問者

補足

どうしてもうまくいきません。ソースは以下の通りです。 #!/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

  • natural
  • ベストアンサー率37% (419/1115)
回答No.4

もう皆さんが大事なところは説明されてますので補足だけ。 deagleさん、burnさんが説明されているHTMLの埋め込みに使っている手法はヒアドキュメントと言います。 ご自分で調べられるときはこの項目で引いてみてください。

Iam2888
質問者

お礼

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

noname#25358
noname#25358
回答No.2

 print を各行の頭につけるだけでは駄目です(笑) HTMLを Perl に埋め込むのは、Perl の使い方としては中級レベルの作業なので、まずは「文字列を記述する際のルール」を復習した方がいいでしょう。  文字は必ずダブルクォート(”)で囲まれていなければならないので、その作業もしなければいけません。また、文字列内にダブルクォートがくると、その前には¥をつけなければならないという決まりもあります。  そんなこと考えててると面倒なので、もっと簡単な方法があります。 print <<EOM; Content-type: text/html <html> 以下略 EOM  このように、「<<EOM」という文字列を使うと、その次の行から EOM までをすべてまとめて出力してくれます。  このとき、「Content-type: text/html」とその次の行の空きは省略してはいけません。これはMIMEヘッダーというもので、Perl からHTMLを出力するときには必ず必要な物です。  それから、Perl はあくまで「HTMLテキストを出力しているだけ」であり、フォームの処理は閲覧者側のパソコンがやることなので、出力してはいけない文字は存在しません。

Iam2888
質問者

補足

早速の回答ありがとうございます。 上記の通り、print<<EOM;~EOMで囲ってみたのですが、下記のエラーがでました。なぜでしょう・・・(涙) Can't find string terminator "EOM" anywhere before EOF at C:\www\test2.cgi line 15. ちなみに15行目は、 print<<EOM; です。

noname#2601
noname#2601
回答No.1

 私もそれほど詳しくないので間違えてるかもしれないですが、ビルダーで作ったhtmlをperlに入れるとは??? ハイパーテキストをプログラムに埋め込んで何をするのですか?CGIにhtmlの要素を付け加えるならそれなりのプログラムを書き足すのが筋で楽じゃないかな?と思うのですが

関連するQ&A

  • パールが実行されない!!

    パールを実行させようとしたのですが、以下のような結果がブラウザで返されてしまいます。 Method Not Allowed The requested method POST is not allowed for the URL /aaa/bbb/ccc/ddd.pl. そこで、元々のHTML内のPOSTをGETに変えてみたところ、今度はddd.plを上記から実行するか、保存するかのダイアログが出てきてしまいます。 <FORM method=POST onsubmit="return check()" action="../../cgi-bin/ddd.pl">               ↓ <FORM method=GET onsubmit="return check()" action="../../cgi-bin/ddd.pl"> サーバー側のパールの設定(パールが動作しない等)なのでしょうか?

  • perlでpostが受け取れない

    perlでCGI を作ってみましたが、POSTでデータが受け取れません。GETは問題ないのですが。read stdin が NULL になります。 ローカルのapache2でテストしています。$ENV{'CONTENT_LENGTH'}がゼロのためだと 思いますが対応が分かりません。 OS:CENTOS6 (VirtualBox) APACHE2.2 Perl 5.10 /var/www/cgi-bin で実行。 呼び出しは <form action='localhost/cgi-bin/uptag.cgi' method='post'"> です。

    • 締切済み
    • CGI
  • perlがうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n"; print "まずい$in{'form2'}\n"; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。 perlの場所も正確です。

    • ベストアンサー
    • Perl
  • CGI間のデータ送信について(perl)

    perlのcgiで詰まってしまったので質問します。 現在困っていることは、cgiからcgiへの変数の値の受け渡しについてです。 色々調べてやってみたのですが、うまくいきません。 送信側で print "<form action = \"sendmail.cgi\" method=\"post\">"; print "<A href =\"sendmail.cgi?$array1[0]&$array1[1]&$array1[2]&$array1[3]\">sendmail.cgi</A>"; print "<input type=\"submit\" value=\" ボタンです。 \">"; print "</form>"; として 受信側で # postでもgetでも受信できるようにする if ($ENV{'REQUEST_METHOD'} eq "GET") { $data = '1'; $testmsg = "GETで受信"; $formdata = $ENV{'QUERY_STRING'}; print("$formdata<BR>"); } elsif ($ENV{'REQUEST_METHOD'} eq "POST"){ # こちらを使用している $data = '2'; $testmsg = "POSTで受信"; $length = $ENV{'CONTENT_LENGTH'}; read(STDIN,$formdata,$ENV{'CONTENT_LENGTH'});# $dataに受信する print("$formdata<BR>"); } else { $data = '3'; $testmsg = "受信することができませんでした。<BR>"; } としてpostにて受信しようとしています。 postのif文には入ったようなのですが、データが空っぽで何も入っていないようなのです。 何が原因なのでしょうか?助けてほしいです。

    • 締切済み
    • CGI
  • name属性をperlに引き継ぎたい

    FORMタグを使って以下のようにCGIに処理を引き継ぎます。 <FORM METHOD="post" ACTION="./xxxx.cgi"> <INPUT name="フリガナ" size="30" type="text"> その場合、入力された値ではなく、name="フリガナ"の 「フリガナ」をperlで受け取りたいのですが、方法がわかりません。 ご存知の方ご教示の程よろしくお願いします。

  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

    • ベストアンサー
    • Perl
  • Perlがサーバー上でうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n; print "まずい$in{'form2'}\n; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。

    • ベストアンサー
    • Perl
  • perl 変数 代入

    恐れ入ります。 Perlで、フォームから送信して、変数に代入したいのですがうまくいきません。 print qq!<form action="./xxx.cgi" method="get">!; opendir(DIRHANDLE, "./xxx"); foreach(readdir(DIRHANDLE)){ next if /^\.{1,2}$/; print qq! <input type="checkbox" name="$_" value="$_"> <input type="submit" value="送信"></form> とし、ディレクトリ内のフォルダ名をnameに格納してxxx.cgiへ送信します。 xxx.cgi側では、 #!/usr/bin/perl use cgi; $form = CGI->new; として、送信されたデータを次々と代入したいのですが、どのようにしたらよいでしょうか。

    • ベストアンサー
    • Perl
  • (Perl)ReadParseによるハッシュへの格納について

    PerlのReadPerseについて質問させてください。 以下少々長いですが、過程を書きます。 <form>タグにより、入力フォームのページをHTMLで作成したとします(form.html)。 その際、<form method="post" action="form.cgi"> と入力しておいて、別途form.cgiを作成するとします。 form.htmlには、<form>タグ内のname属性で、それぞれ'weight' 'height' 'age'という三種類のデータを入力してもらって、取得するようにしています。 そして<input type="submit" value="登録">による、 登録ボタンを押すことで、 form.cgiに処理をさせるようにしています。 form.cgiの中身ですが、まず、最初の三行を書きます。 #!/usr/local/bin/perl require 'cgi-lib.pl'; &ReadParse(*form); となるのですが、わからないのが、 三行目の &ReadParse(*form); です。 サブルーチンReadParseを引数*formで、 cgi-lib.plから呼び出しているということはわかるのですが、いきなり*formという形で、ハッシュを登場させているあたりがわかりません。(この際、ハッシュ名の前の%を*に変えなければならないことは、一応知っております。理由はわかりませんが。) そこで質問なのですが、 いきなり、ハッシュであるformを登場させていいものなのでしょうか?? 以下、form.cgiの内容です。 #!/usr/local/bin/perl require 'cgi-lib.pl'; &ReadParse(*form); $name=$form{'weight'}; $sex=$form{'height'}; $megane=$form{'age'}; print "Content-type: text/html\n\n"; print "<html>\n"; print "<body>\n"; print "体重:${weight}<br>\n"; print "身長:${height}<br>\n"; print "年齢:${age}<br>\n"; print "</body>"; print "</html>"; _END_

    • ベストアンサー
    • CGI
  • アクセス元URLによって振り分ける方法

    アクセス元がアドレス1だった場合は<FORM name="form" action="1.cgi" method="POST">を表示 アクセス元がアドレス2だった場合は<FORM name="form" action="2.cgi" method="POST">を表示 アクセス元がアドレス3だった場合は<FORM name="form" action="3.cgi" method="POST">を表示 アクセス元がアドレス4だった場合は<FORM name="form" action="4.cgi" method="POST">を表示 アクセス元がアドレス5だった場合は<FORM name="form" action="5.cgi" method="POST">を表示 というように、50以上のアクセス元によって別々のCGIに送信するよう全振り分けたいのですが、方法がわかりません。 どなたかご教授宜しくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう