プログラム質問箱への投稿
記事番号00587へのフォローを投稿します。
引用記事中のHTMLをエスケープせずに
そのまま引用
することも出来ます。
お名前(ペンネイムで結構ですが必要です)
(
ブラウザに個人情報を覚えさせない)
電子メイルアドレス(必要です)
題名(必要です)
Home Page がある方はリンク希望先の URL を記載して下さい
会議室に載せたい内容を以下へお書き下さい (
HTMLを解釈せずにそのまま表示)
1月20日に、いしどうさんは書きました。 >いしどう です。 > >つい、デバッグしてしまいました (^^;; > >三葉工房の管理者さんへの質問、と言う形でおこたえしたいとおもいます。 > >まず、サーヴァエラー、になると言う点に付いて。 >三葉工房の管理者さんが参考にした、というスクリプトですが、 > >>if ($ENV{'REQUEST_METHOD'} eq 'GET') >>{ >>@pairs = split(/&/, $ENV{'QUERY_STRING'}); >>} >>elsif ($ENV{'REQUEST_METHOD'} eq 'POST') >>{ >>read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); >>@pairs = split(/&/, $buffer); >>} >>else { >>&noname; >>} >> >>foreach $pair (@pairs) >>{ >><font color=#FF0000>($name, $value) = split(/=/, $pair); >>$name =~ tr/+/ /; >>$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; >>$value =~ tr/+/ /; >>$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; >>&jcode'convert(*value,'sjis'); >>&jcode'convert(*name,'sjis'); >>$value =~ s/<!--(.|\n)*-->//g; >>$value =~ s/<html(.|\n)*//ig; >>$value =~ s/<script(.|\n)*//ig; >>$value =~ s/<table(.|\n)*//ig; >>$value =~ s/<form(.|\n)*//ig; >>$value =~ s/<html(.|\n)*//ig; >>$value =~ s/<xmp(.|\n)*//ig; >>$value =~ s/\r\n/<br>//g; >>$value =~ s/\r/<br>//g; >>$value =~ s/\n/<br>//g; >>$in{$name} = $value; >></font>} >> >>if ($in{'submit'} eq '登録') { >>&check; >>&toppage; >> >>} >>else {&toppage;} > >ほんとうに、まったく同じですか? >特に、foreachブロックの中(赤く示したところ)、どうみても写し間違い >にしか見えない部分があるのですが(構文が間違っている)。 >ひとつひとつの正規表現の意味、なにをしているか、を調べてみて下さい。 > >わたしが試した範囲では、それを修正すれば、まちがいなく連想配列 %in >にフォームで入力した内容が渡っています。 > > >次に、フォームで入力された値が変数に反映されない、と言う点。 >$name や $mail という変数ですよね? >三葉工房の管理者さんのスクリプトで言えば、このへん。 > >>$coment = $in{'coment'}; >>$name = $in{'yourname'}; >>$mail = $in{'mail'}; >>$gurl = $in{'gurl'}; >>$hpagename = $in{'hpagename'}; > >この時点で、フォームから入力された内容が、連想配列 %in (という >か、$name であれば $in{'yourname'}、$mail であれば $in{'mail'}) >に反映されているでしょうか? >スクリプトは、基本的に上から下へ順番に実行文が実行される事を思い >出して下さい。 > > >最後に、同一の CGI で動きを変える方法に付いて(***.cgi?action=*** >という方法) >三葉工房の管理者さんのやりかたで、あってます。わたしがテストした >範囲では動きました。 >でも、スクリプトが出力する内容が変ですね。 > >三葉工房の管理者さんのスクリプトだと、action=repage のとき、まず >&toppage が呼ばれて、次に &rever が呼ばれますね。 >(本筋とは関係ないですが、rever とは何を示しているのですか? 将来 >スクリプトを修正するときに何をさせている関数か忘れてしまって困る >事もあると思いますので、わかりやすい名前にしておいたほうがいいと >思います) >そうすると、<head>タグが一つの HTML ページの中で2回現れる >ことになり、HTML の内容をチェックしているようなヱブサーヴァでは >エラーとして扱われる事になると思います(あ、答えを書いちゃった)。 > > >あと、スクリプトで作成した HTML ページ内での、スクリプト自身への >リンク先がちゃんと指定されていないところも見受けられました。 >たまたまカレントディレクトリが移ってたんで動作していたんでしょうが、 >HI-HO での CGI スクリプトの指定の仕方に合わせたほうが、将来サーヴァ >側の構成変更があったときに対応しやすいと思います。 > > >1月19日に、三葉工房の管理者さんは書きました。 > >>実は,私がアドバイス願いたいのは,cgi-libを一切使用せず,jcode.plだけで >>フォームからの情報を渡す方法です。 >> その方法こそが,perlのプロを目指す為の最低限知っておかなければテクニック >>だと思うからです。 > >わたしならば目的のスクリプトを手っ取り早く動かすことのほうを優先した >いと思うので、道具(cgi-lib.pl や jcode.pl のような)があるのならば、 >苦労してそのようなものを再創造するよりもそれらを使いますけれども…。 >(大概において、自分で再創造するよりもどこかからみつけてきたものの >方が出来がよいですし (^^;;) > >まぁ、そのへんは個々人の考え方なんで、わたしの考え方を強制すること >はできませんが (^^) そちらのほうが効率が良いと思いますがいかがでしょ >う。 > >書籍の方は、もうしばらくお待ち下さい。 >三葉工房の管理者さんも、書店で自分に合いそうな本をさがしてみてくだ >さいね。 >(2・3見てみたのですが、どうもプログラミングの経験がある人を対象 >にしてるようなのしか見つからなかったんで…もうすこし探してみます) > >あと、スクリプトを引用するのであれば、HTML のタグとして使われるよ >うな文字(「&」とか「<」、「>」)は、<b>「&amp;」 >「&lt;」「&gt;」</b>と書いて下さいね (^^) (一括未読表示 >をしたら、三葉工房の管理者さんの発言のところで、存在しないページ >へ飛んでいってしまいました(^^;;)
ホームペーヂに戻る
nir@mvg.biglobe.ne.jp
Last Update: 2 December 1999