- ベストアンサー
perl if文 助けて~
perl初心者ながら暇見て住所CGIフォームを作っています。 だんだん完成してきましたが今一歩です(T_T)ご指導下さい! 名前、電話、都道府県、住所、の4つの項目があります。 {'nam'} {'tel'} {'pre'} {'add'} {'pre'}はSELECToption 他はtextFORM 全部記入した時には、次に進めてOKなのです。 if ((($in{'nam'}) && ($in{'tel'}) && ($in{'add'}) && ($in{'pre'} > "0")) { print 全部未記入時でも、次に進んでも無記入なのでOKです。 エラー時に&errorのエラー画面に飛ばす事も出来ました。 ただ、書き忘れ時が困るので {'nam'} {'tel'} {'pre'} {'add'}の内、1~3つとか記入して 他が抜けてたりした時だけエラーにしたいのです。 でも間違って空スペースとかでエラーが出て欲しくないし・・・ まずは下記でやってもまだダメです、($in{'pre'} > "0")が未選択時がダメです(T_T) 色々やってみたのですが、何か良い方法ありませんか? #### ($in{'pre'} > "0")は、"1"以上が「真」の条件です。 if ((($in{'nam'} eq "") || ($in{'tel'} eq "") || ($in{'add'} eq "")) && ($in{'pre'} > "0")) { &error("エラー"); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ANo.1です。すみません、読み違えてました。 全部入力か、全部未入力ならOKなんですね。 本当はif文を分けて、しかもelseを使った方が理解しやすい気はしますが、 if ( ( ($in{'nam'} eq "") || ($in{'tel'} eq "") || ($in{'add'} eq "") || ($in{'pre'} <= "0") ) && ( ($in{'nam'} ne "") || ($in{'tel'} ne "") || ($in{'add'} ne "") || ($in{'pre'} > "0") ) ){ &error("エラー"); } でいいのかな。
その他の回答 (2)
- nyaa519323116
- ベストアンサー率51% (41/79)
チェック用のサブルーチン作っちゃいますけれどね、私なら。 条件煩雑だし、将来拡張もできるようにしたいから。 sub cond_check { my ($in) = @_; my $cond_check = 0; for my $key ('nam','tel','add') { ++$cond_check if ($in->{$key} ne ''); } ++$cond_check if ($in->{'pre'} > 0); if ($cond_check == 0 || $cond_check == 4) { return 1; } return; } 呼び側は、 if (! cond_check(\%in) ) { &error("エラー"); }
お礼
わざわざありがとうございました。 そうですよね・・・本当は、そんな感じでにやりたいのですが perlの基本も知らないので他のエラーと合わせるのがちょっと難しいです・・・ もう少し勉強してから将来変更させて頂きます。
- Tiffa9900
- ベストアンサー率31% (68/216)
if ( ($in{'nam'} eq "") || ($in{'tel'} eq "") || ($in{'add'} eq "") || ($in{'pre'} <= "0") ) { &error("エラー"); } では、ダメなのでしょうか?
補足
それもやったんですが全部未記入時にもエラーになりますよね?。 全部未記入時には、 未記者はスルーでOKなのでエラーを出したくないのです・・・ 記入希望者が途中まで記入した場合の記入漏れ防止で 4つの内、1~3項目のみ記入時エラーにしたいのです。お願いします。
お礼
希望通りになりました!ありがとうございました。 >本当はif文を分けて、しかもelseを・・・ その点は、初心者なので今後の課題で。まず問題なく動けばOKです。