カレッヂ |
質問者 フランク
投稿日 5/1(水) 15:39:59
こんにちわ。 こちらのフォームメールCGIをダウンロードして使おうと思っておりますが、一部CGIの中で何をやっているのかわからないところがありまして、ご質問いたしました。 ***** #データ入力 if ($ENV{'REQUEST_METHOD'} ne "POST") { &error('エラー','標準入力 METHOD=POST を設定してください.<br><form method=post action=........>'); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); if ($buffer eq '') { &error('エラー','このCGIは直接起動されません.'); } $ref = $ENV{'HTTP_REFERER'}; $buffer2 = $ENV{'QUERY_STRING'}; if ($buffer2 ne '') { &error('エラー','標準入力 METHOD=POST に設定してください.<br><form method=post action=........>'); } #デコード @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); if ($value =~ /\r\n/) { $value =~ s/\r//g; } elsif ($value =~ /\r/) { $value =~ s/\r/\n/g; } if ($name eq "location") { $lct = $value; } elsif ($name eq "c_copy" && $value eq "on") { $cc = "on"; } elsif ($name eq "no_check" && $value eq "on") { $nocheck = "on"; } elsif ($name eq "space_check" && $value eq "on") { $spcheck = "on"; } elsif ($name eq "no_check") { ; } elsif ($name eq "ref_url") { $ref_url = $value; } elsif ($name eq "ref_name") { $ref_name = $value; } elsif ($name eq "subject" && $value ne "") { $subject = $value; } elsif ($name eq "subject") { ; } elsif ($name eq "ref_page") { $ref = $value; } elsif ($name eq "password") { $password = $value; push(@DATA_N,$name); push(@DATA_V,$value); } else { if ($name =~ /^email/i || $name =~ /^e\-mail/i) { $value =~ s/ / /g; if ($value =~ / / || $value =~ /;/) { $value = ""; } if (!($value =~ /(.*)\@(.*)\.(.*)/)) { $value = ""; } $email = $value; } push(@DATA_N,$name); push(@DATA_V,$value); $name =~ s/\</</g; $value =~ s/\</</g; $name =~ s/\>/>/g; $value =~ s/\>/>/g; $name =~ s/\"/"/g; $value =~ s/\"/"/g; push(@DATA_NS,$name); push(@DATA_VS,$value); } } ******** 上記部分は、何に対して何を行っているのでしょうか?一文一文の解説でなくて良いので、全体が何をする為に必要なのかわかりたいところです。 また、 ******** #入力チェック if (!$mailcheck && $email eq '') { &error('Eメールを入力してください',''); } ******** の、!$mailcheckとは、どういう状態のことをいうのですか?!で否定するということで、$mailcheckが指定のないとき、、、ということでしょうか? まったくの初心者なのでCGI&Perlのリファレンスを読んでいるのですが、よくわかりません。 どなたかお教えください。宜しくお願いいたします。 |
回答者 しあわせのツボ
[削除]
投稿日 5/1(水) 17:29:08
ブラウザから送られたデータをデコードし配列に代入していく、基本的な部分です。 ただ、最後にハッシュでなく配列に格納しているのと、 真ん中へん(elsifが並んでいるあたり)でついでの作業をさせているため、 一般的なコードとは異なった形になっています。 # レスキューさんが何年も前に書いたままになっているので、多少冗長かもしれません。 !は論理否定で、真なら偽、偽なら真にひっくり返す作用があります。 Perlにとって変数の真偽は「0か""(空白)なら偽、それ以外は真」です。 この場合、$mailcheckが偽(で$emailが空白)の時にif文を実行させたいので、!によって真偽を入れ替えてやる必要がある訳です。 |
質問者 フランク
[削除]
投稿日 5/1(水) 17:53:44
しあわせのつぼさん、有り難うございます。 !についても良くわからなかったので、随分とあのCGIについてわかりました。 もう一つ、内容確認をする部分のhtmlタグ中に、 <form method=\"post\" action=\"webform.cgi\"> とあり、さっき質問したのと同じCGIをそのCGI中で呼び出しているようなのですが、こういうことをするとループにならないのですか? webform.cgiのなかで、webform.cgiを呼び出しているということが理解できません。。。 |
回答者 しあわせのツボ
[削除]
投稿日 5/1(水) 19:26:06
呼び出すためのHTMLを出力しているだけなので、利用者が実際にそのリンクを使うまでは呼び出されません。 確認したものを「これでOKだよ」と利用者が伝える相手は誰ですか? webformですよね。 なので、もう一度webformを呼び戻す必要がある訳です。 |
質問者 フランク
[削除]
投稿日 5/2(木) 09:15:18
しあわせのつぼさん、たびたびわかりやすくご説明いただき有り難うございます! なーるほど、そうかと思いました。 勉強になりました。 また何かありましたらどうぞ宜しくお願いします! |
このページは終了したので返信(回答)は書きこめません
Web裏技 |