PerlのIF関数が動作しません。

[上に] [前に] [次に]
Weasel 2000/03/02(木) 14:59:18
いつも楽しく拝見しています。
Perlについて質問があります。

とほほさんのメール送信フォームを改造して、
アンケート用のメール送信CGIを制作しています。

その中で空白項目をチェックする機能を追加したのですが
何度やってもエラー画面しか表示されません。
ソースは下記の通りです。

if ($FORM{'nickname'} eq "") {
&error;
} else {
&send_data;
}

サブルーチン「sub error」でエラー画面を表示
(print "Location: http://www.hoge.co.jp/error.html

sub send_dataで、とほほさんのwwwmail.cgiのメール送信
機能を使う、といった感じです。

しかし、何度やってもエラー画面しか表示されません。
sub send_dataの出力がおかしいのかな、と思い、デバック用に

$toko_data  = "$FORM{'nickname'}";として
その変数を書き出すようにしましたが、やはりエラー画面しか
表示されないようです。

ifの構文は、始めは書籍を見て入力してダメだったので、
とほほさんのリファレンスからコピーペーストして、
必要な箇所だけ書き換えました。(タイプミスを防ぐため)

以上、よろしくお願いいたします。

ラウォッチ 2000/03/02(木) 15:10:53
フォームのエレメント名に間違いはありませんか?

例、<INPUT TYPE="text"  NAME="nickname">と$FORM{'nickname'}のnicknameはスペル間違いないですか?

EMI 2000/03/02(木) 15:40:58
ちょっとつっこみ。
ifは関数ではありません。Perlの制御構造です。

それから、Perlは大文字小文字を区別するのでifをIFと書いてはいけません。(このトピックのタイトル)

Weasel 2000/03/02(木) 16:23:56
コメント、ありがとうございます。

> フォームのエレメント名に間違いはありませんか?
確認しましたが、合っています。
(念のためコピーペーストして再度検証しましたが同じです)

> ifは関数ではありません。Perlの制御構造です。
すみません。Excelやファイルメーカーでifを知ったので、
つい間違えてしまいました。

その他検証したこと
・perl-wcでデバック済み
・改行コードはUnixです。
・jcode.plやminew.plは同じ階層に入ってます。
・パーミッションは設定してあります。
・wwwmail.cgiの自己診断機能でチェックしてあります。
・sendmailへのパスなどはOKのはずです。
(ifでつまずいているので、深く検証していないです)

この文章を書いていて、ふと思ったのですが、
if ($FORM{'nickname'} eq "") {
この部分が問題ではないかと、、、
一度、変数に取り込んだほうがいいかな、って

ちょっと検証してみます。

Weasel 2000/03/02(木) 16:28:56
$nickname = "$FORM{'nickname'}";

if ($nickname eq "") {
&error;
} else {
&send_data;
}

としましたが、やはりエラー画面が表示されます。

たれ 2000/03/02(木) 16:29:56
もしやとは思いますが、デコード作業を行っていないということは
ないでしょうか?

ifの前までに%FORMが作られていなければ.....

>この文章を書いていて、ふと思ったのですが、
>if ($FORM{'nickname'} eq "") {
>この部分が問題ではないかと、、、
>一度、変数に取り込んだほうがいいかな、って

あんまり関係ないです。
個人的に大元の値をいじくり回すのが好きくないので
一度別の変数に代入する方法を私はとってますけど。

Weasel 2000/03/02(木) 16:49:39
> もしやとは思いますが、デコード作業を行っていないということは
> ないでしょうか?

デコードとは、
$nickname = "$FORM{'nickname'}";
&jcode'convert(*nickname, "jis");
でよろしいのでしょうか?

空白か、そうでないか、というチェックだったので
デコードは必要ないと考えていたのですが、
やはり必要なのでしょうか?

EMI 2000/03/02(木) 16:53:31
いえ、フォームデコードです。
http://www.tohoho-web.com/wwwcgi3.htm#CgiEncode

たれ 2000/03/02(木) 16:54:18
ええっと、ブラウザからもらってくるデータが、そのまま
%FORMに組み込まれるわけではありません。

GETの場合は$ENV{'QUERY_STRING'}
POSTの場合は標準入力

に、値が入っているわけです。
厳密に言うと、デコード作業ではなく
変数に組み込む作業なのですが.....

これくらいの解説でよろしいでしょうか?

ラウォッチ 2000/03/02(木) 16:58:39
たれさんの以下に1票!
>デコード作業を行っていないということはないでしょうか?

ラウォッチ 2000/03/02(木) 17:06:51
おー、ソース見ていた間に...。ピエロになってしまった。
nicknameに対しても以下のnemeと同じ様な処理(URLデコード)が必要です。

$name =~ tr/+/ /;
$name =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
&jcode'convert(*name, "jis");
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
$value =~ s/[\r\n]+/\n/g;
&jcode'convert(*value, "jis");
if ($FORM{$name} eq "") {
$FORM{$name} = $value;
$FORM[$cnt++] = $name;
} else {
$FORM{$name} .= (" " . $value);
}

Weasel 2000/03/03(金) 05:09:12
ありがとうございます。解決しました。

根本的な問題は、とほほさんのwwwmail.cgiと参考書の
例題をコピーペーストで利用しようとしたことでした。

デコードについて調べるうちに、Perlのライブラリで
対応できることに気付きました。


> require "cgi-lib.pl";
> require "jcode.pl";
> require "mimew.pl";

> &ReadParse;
> $nickname = $in{"nickname"};
> &jcode'convert(*nickname,"jis");

> if ($nickname eq ""){
> &error_page;
> }else{
> &send_data;
> }

> sub error_page{
> print "Location: http://www.hoge.co.jp/error.html\n\n";
> exit;
> }

> sub send_data{
> 〜〜メール処理〜〜
> print "Location: http://www.hoge.co.jp/thanks.html\n\n";
> exit;
> }

こんな感じです。
貴重なアドバイスをいただき、皆様には心より
感謝申し上げます。

[上に] [前に] [次に]