質問: 入力規則をまとめて定義 お世話になります。 cgi/perlを使用してフォームを作成しています。 フォームの一部に製品入力欄を設けており、 一度の登録申請で1-10まで10個分製品が登録可能です。 それぞれの製品に、販売先、販売日など詳細項目を入力するようになっています。 同じ部分で別の問題も抱えているのですが、 今回は書式設定についてうかがわせてください。 上記販売日をyyyy/mm/ddの書式で入力しないとエラーを返すように以下のように記述しました。 if (($form{'kounyuu_01'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/){ &error('販売日の書式が間違っています。'); } ただこれを10個分書くと01,02,03と末尾を変えただけの記述を何度もしなくてはならず、cgiが長くなってしまうため、まとめて定義したいと考えました。 そこで以下のようにしてみたのですが、 1つ目の製品以外の販売日が入力されていないと上記「'販売日の書式が間違っています。'」のエラーが返ってきてしまいます。 if (($form{'kounyuu_01'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) | ($form{'kounyuu_02'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) | ($form{'kounyuu_03'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) | ($form{'kounyuu_04'} !~ /[\d\d\d\d]+\/[\d\d]+\/[\d\d]/) ....) { &error('移管日の書式が間違っています。'); } 製品は最低1つの入力は必須ですが、それ以外は任意なので、 入力があった場合だけ書式をチェックするようにしたいのですがこの場合はどのようにすれば良いのでしょうか。 説明が悪くて申し訳ないですがアドバイスをお願い致します。m(__)m
回答: 別の一例をば。 ところで、日付のチェックを厳格に行うなら先頭と最後も指定してやりましょう。 このままだと、 a2006/02/06b とか 2006/02/060 なんてのも"マッチ"するので書式が違うとはなりません。 そこで、^ で先頭 $ で後方を指定します。 $n = 0; for(1..10){ $i = sprintf("%02d",$_); if($form{'kounyuu_'.$i} ne ""){ $n++; if($form{'kounyuu_'.$i} !~ /^\d{4}\/\d{2}\/\d{2}$/){ &error('販売日の書式が間違っています。'); } } } if(!$n){&error('最低一つ、販売日の入力が必要です。');}