新規記事投稿 フォロー記事投稿 記事のキャンセル
From: いしどう <ishidou@po.iijnet.or.jp>
Subject: つい、デバッグしてしまいました (^^;;;
Date: 1999/01/20 02:44:25
Reference: mesh.program/00586

いしどう です。

つい、デバッグしてしまいました (^^;;

三葉工房の管理者さんへの質問、と言う形でおこたえしたいとおもいます。

まず、サーヴァエラー、になると言う点に付いて。
三葉工房の管理者さんが参考にした、というスクリプトですが、

>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)
>{
>($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;
>}
>
>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 のタグとして使われるよ
うな文字(「&」とか「<」、「>」)は、「&amp;」
「&lt;」「&gt;」と書いて下さいね (^^) (一括未読表示
をしたら、三葉工房の管理者さんの発言のところで、存在しないページ
へ飛んでいってしまいました(^^;;)