• ベストアンサー

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("エラー"); }

  • Perl
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • Tiffa9900
  • ベストアンサー率31% (68/216)
回答No.2

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("エラー"); } でいいのかな。

takumana20
質問者

お礼

希望通りになりました!ありがとうございました。 >本当はif文を分けて、しかもelseを・・・ その点は、初心者なので今後の課題で。まず問題なく動けばOKです。

その他の回答 (2)

回答No.3

チェック用のサブルーチン作っちゃいますけれどね、私なら。 条件煩雑だし、将来拡張もできるようにしたいから。 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("エラー"); }

takumana20
質問者

お礼

わざわざありがとうございました。 そうですよね・・・本当は、そんな感じでにやりたいのですが perlの基本も知らないので他のエラーと合わせるのがちょっと難しいです・・・ もう少し勉強してから将来変更させて頂きます。

  • Tiffa9900
  • ベストアンサー率31% (68/216)
回答No.1

if ( ($in{'nam'} eq "") || ($in{'tel'} eq "") || ($in{'add'} eq "") || ($in{'pre'} <= "0") ) { &error("エラー"); } では、ダメなのでしょうか?

takumana20
質問者

補足

それもやったんですが全部未記入時にもエラーになりますよね?。 全部未記入時には、 未記者はスルーでOKなのでエラーを出したくないのです・・・ 記入希望者が途中まで記入した場合の記入漏れ防止で 4つの内、1~3項目のみ記入時エラーにしたいのです。お願いします。

関連するQ&A

  •  IF文 教えて下さい。

    例 if (($in{'pre'} ne "0") && ($in{'pre'} ne "-1")) { 不要なoptin valueを 0と-1。必要が1-47。 value="1" から value="47" までを真にしたいのですが 例を簡単にするには [1-47] 1< とかどう書けば良いのでしょう?・・・ -------------------------------------------- if ($in{'nam'} && $in{'tel'} && ($in{'pre'} ne "0") && ($in{'pre'} ne "-1") && $in{'add'}) { 今はこんな感じでやってるのです・・・ 全部揃ったら真って感じです。条件文が毎回長くなってw(≧m≦)w

    • ベストアンサー
    • Perl
  • if 文  わかんない・・・

    都道府県セレクトoptionフォームにて 都道府県を選択しない場合のエラーを なんとか2行で出せるようになったのですが 選択して下さい = value="0" if ($in{'pre'} eq '0') { &error("都道府県の選択!!"); } if ($in{'pre'} eq "") { &error("都道府県の選択!!"); } これを1行にするにはどうしたらいいのでしょう? ↓↓はダメでした(≧m≦) if ($in{'pre'} eq "" || '0') { &error("都道府県を選択!!"); }

    • ベストアンサー
    • Perl
  • if文がうまく書けない(T.T)

    某CGIを改造してます。 CGIにIDとPassを組み込もうとしているのですが、うまくできません。 いろいろな認証CGIを真似してやっているのですが… sub pass2{ open (FILE,"$passdata"); @file = <FILE>; close FILE; foreach (@file) { local($nm,$ps)= split(/,/,$_); if ($nm eq $in{'name'} && crypt($in{'password'},$ps) eq "$ps") { &admin; exit; } } &error("認証に失敗しました?"); } この状態だと動くことは動くのですが、ちょっと面倒なので逆転させたいんです。 そこで以下のように作り変えてみました。 if ($nm ne $in{'name'}) { &error("名前が違います"); exit; } if ($nm eq $in{'name'} && crypt($in{'password'},$ps) ne "$ps") { &error("パスワードが違います。"); exit; } } &admin } こうすると、なぜか正しい名前を入れても「名前が違います」のメッセージが出ます。 いったいどこが間違っているのですか? 言語はperlです。 お願いします。

    • ベストアンサー
    • CGI
  • 電話番号かどうかを判断したい(Perl)

    フォームに入力された文字が電話番号かどうかを判断したいと考えています。 ハイフンは使いません。 if ($$in{tel} =‾ /¥-/) { &error("電話番号はハイフン( - )なしの10桁または11桁でご記入ください"); } if ($$in{tel} =‾ /^\d{10,}+$/) { &error("電話番号はハイフン( - )なしの市外局番からご記入ください"); } このようにしてみたのですが、うまく動きません。 どうすればいいんでしょうか... よければ教えてください。

    • ベストアンサー
    • Perl
  • if文について

    if文を利用してリストの表示をしようとしています。 ドロップダウンリストは <SELECT name="type"> <OPTION value="all">指定しない </OPTION> <OPTION value="1">タイプA系列</OPTION> <OPTION value="2">タイプB系列</OPTION> となっています。 データはチェックボックスで1か空白で保存されていて、A系列は「s_1」「s_2」、B系列は「s_3」「s_4」「s_5」にチェックが入っているかどうかを振り分けしたいんです。 なので、ドロップダウンリストで「タイプA系列」を選択したら「s_1」「s_2」に1が入っている物のみ表示するというものです。 現在のところこの形です。 if ($FORM{'type'} ne 'all') { if ($FORM{'type'} eq '1'){ if ($s_7 || $s_8 eq 1) { ; } else { next; } }else{ if ($s_9 || $s_10 || $s_11 eq 1) { ; } else { next; } } } このようにやってみましたが全部表示されてしまいます。 どのように直したらOKでしょうか? お願いします。

    • ベストアンサー
    • Perl
  • フォーム内容が正しく取得できない

    入力画面で入力したデータを、 確認画面でHiddenに設定し、 確認OKでHiddenからの入力データを メールで送信するCGIを作成しました。 確認画面では、入力内容を正しく表示するのですが、 確認OKでメールを送信すると 同じNameの入力項目の情報を重複して表示してしまいます。 こんな感じです・・・ 【入力・確認画面】 Add:住所1 Tel:999-999-999 Add:住所2 Tel:111-111-111 【メール内容】 Add:住所1 Tel:999-999-999 Add:住所2 Tel:111-111-111 Add:住所1 Tel:999-999-999 Add:住所2 Tel:111-111-111 フォーム内容を取得するところがまずいのでしょうか・・・ 補足等致しますのでアドバイスお願いいたします。 【フォーム内容を取得】 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; }

    • ベストアンサー
    • CGI
  • フリーメールは投稿できないようにする掲示板

    お世話になります。 フリーメールで投稿できないようにするにはどうしたら良いのでしょうか? 恥ずかしいくらいの初心者ですので宜しくお願いします。 (※フリーメールって言っても、一般的な5・6社程度ですが…) if ($in{'email'} eq "") { &error("メールアドレスが記入されていません"); } if ($in{'email'} eq "*@yahoo.co.jp") { &error("フリーメールは使えません"); } if ($in{'email'} eq "*@hotmail.com") { &error("フリーメールは使えません"); }  ・  ・ ワイルドカードの使い方も実はわからないのです。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • PHPのif文について。

    今PHPのif文で前のページで入力したIDとPWをファイルで読み込んだIDとPWを使い 一致したらログインするという形をとろうとしています。 ぶっつけでは不安なので一応if文が通るかどうか実験したのですが、 Parse error: syntax error, unexpected '[', expecting '(' in C:\xampp\htdocs\ninsho.php on line 7 とエラーが出てきます。 軽く調べたところ[の使いかたを間違えてるとあったのですが、[は配列の場所を指定するのに 必須だと思うのでおかしいところがわかりません。 ちなみに全角なんじゃないかと思い全部打ち直してるので全角で入力という間違いはありません。 ↓こちらが今回の問題のものです。 1:<?php 2:$id = $_POST["id"]; 3:$pw = $_POST["pw"]; 4:$array = file("C:\acount.csv"); 5:for ($i=0; $i < count($array); $i++) { 6:$line = explode(",", $array[$i]); 7:if ($id === array[0] && $pw === array[1]) 8:{ 9:print $id 10:} 11:} 12:?> if文の===と==とimplodeは試してみましたが同じエラーでした。 どなたか原因のわかる方はいらっしゃらないでしょうか? ※ 1:などは行数をわかりやすくるるために今入力したものです。

    • 締切済み
    • PHP
  • perlのdo-while文で抜け出せない 

    perlのwhile,do-while,last文に関する質問です。 1) code1のようなプログラムを作ったのですが   eでdo_whileを抜け出すことができませんがなぜでしょうか。 ---code1(eで抜け出せない)(NG)--- my $sum=0; do{  my $a=<STDIN>;  chomp($a);  $sum=$sum+$a; }while($a ne 'e'); print $sum; -------------------------------- 2) 抜け出す方法をいろいろ試していたら   while(1)にしてlastで抜けるようにすると   code2ではeで抜け出すことができるように   なりましたが、   do~while(1)にしたcode3では、  「Can't "last" outside a loop block at …」C   というエラーが発生します。   code2とcode3はwhileがdo~whileになって   条件を見る位置がループの始めか終わりの   違いだけなのに、なぜ、code2ではOKで、   code3ではエラーになるのでしょうか。 ---code2(eで抜け出せる)(OK)----- my $sum=0; while(1) {  my $a=<STDIN>;  chomp($a);  last if ($a eq 'e');  $sum=$sum+$a; }; print $sum; --------------------------------- ---code3(エラーになる)(NG)----- my $sum=0; do{  my $a=<STDIN>;  chomp($a);  last if ($a eq 'e');  $sum=$sum+$a; }while(1); print $sum; --------------------------------- よろしくお願いします。 Windows7 , ActivePerl(v5.16.3)

    • ベストアンサー
    • Perl
  • Perlでの改造方法

    とほほHPでPerlについて勉強し始めたのですが、わからない箇所があり困っております。 フォームaに「1」と記入した場合はフォームbに「2」と記入しないとエラーが起こるようにしたいのですが、どうしてもわかりません。 if ($in{'a'} =~ /1/だった場合に$in{'a'} !~/2/) {&error("エラー文字");} こんな感じにしたいのですが、どうすればいいのでしょうか。 また、Perlの勉強をするにお勧めの本などありましたら教えていただけると助かります。宜しくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう