- ベストアンサー
エラーチェック、ファイルに特定の文字列があったらエラーの処理を出したい。
たびたび質問すいません。 エラーチェックについて質問です。 sub err_check{ $data="data.txt"; open(LOG,"$data"); @readerlist = <LOG>; close(LOG); foreach $list (@readerlist) { $newlist = $list; $newlist =~ s/\n//g; $newlist =~ s/\r//g; if($newlist eq $mail) {&err("$mail は既に登録済みです");} } } という記述は動作しました。この逆、$mailは登録されていませんというエラー処理を吐き出すには、($newlist eq $mail)を($newlist ne $mail)とやればできるのかと思いましたがうまくいきませんでした。 data.txtの中身はメールアドレスですが、アドレスごとに改行コード↑が入ります。data.txtのファイルの中身を検索して、$mailがなかったら登録してません。と はきだす処理の記述はどのようにしたらいいのでしょうか?
- ken_0401
- お礼率30% (152/504)
- Perl
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
リストに特定のデータが「ない」と言えるためには、リストの要素をすべて確認し終えてからでなくてはならないので、例えば、プログラムの一部を以下のように書きかえる必要があると思います # $flag: 見つかったか確認のためのフラグ。 # 0 ... 「まだみつかっていない」 # 1 (2, 3, ...) ... 「すでに見つかった」 $flag=0; foreach $list (@readerlist) { $newlist = $list; $newlist =~ s/\n//g; $newlist =~ s/\r//g; if($newlist eq $mail) {$flag++} # 見つかった場合、あるいは"$flag++; last;" } # 一度も以上の「見つかった場合」が実行されなかったとき: if(! $flag) { &err("$mail は登録されていません"); }
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
foreach $list (@readerlist) { $newlist = $list; $newlist =~ s/\n//g; $newlist =~ s/\r//g; if($newlist eq $mail) {&err("$mail は既に登録済みです");} } を foreach $list (@readerlist) { $newlist = $list; $newlist =~ s/\n//g; $newlist =~ s/\r//g; return if($newlist eq $mail); } &err("$mail は登録されていません"); ぐらいでいいんじゃないかな
関連するQ&A
- Node.js ファイル操作の非同期処理について。
現在Node.jsを勉強しているのですが。 下記が教材に書いてあった、ソースコードです。 -------------------ここから------------------ const fs = require('fs'); // ファイルの書き込み fs.writeFile('test.txt', 'テストファイルの中身です。', function(err) { if (err) { console.log('エラー発生。'); console.log(err); return; } // ファイル読み込み。エンコーディングを指定する必要がある fs.readFile('test.txt', {encoding: 'utf8'}, function(err, data) { if (err) { console.log('エラー発生。'); console.log(err); return; } console.log('読み込んだ内容:' + data); }); }); // ここですぐにファイルを読むのは誤り! // この時点ではファイル書き込みがされている保証はない -------------------ここまで------------------ なのですが、このコメント部分の説明 // ここですぐにファイルを読むのは誤り! // この時点ではファイル書き込みがされている保証はない これは合ってますか? この場合、タスクキューに、 「ファイルの書き込み操作」がエンキューされ。 「ファイルの読み込み操作」がエンキューされ。 コールスタックが空になったら、 「ファイルの書き込み操作」がデキューされ実行。 コールスタックが空になったら、 「ファイルの読み込み操作」がデキューされ実行。 という処理を踏むと思うのですが。違うのでしょうか。 コメントの部分に、console.log("終了")って書いてしまうと、一番最初に終了って文字が出てしまうと思うのですが。 ファイル操作に関しては、タスクキューに入るので、順番に実行されるような気がします。 よろしくお願いします。
- ベストアンサー
- JavaScript
- 複数のCGIを一括で動作させるには?
よろしくお願い致します。 現在ネットショッピングのホームページを制作しています。 ショッピングカートのお客様情報を入力するページにメールアドレス を入力する項目があるのですが、この入力項目を利用して、別に用意 したメルマガ用CGIの登録も同時に行えないかと考えております。 メールアドレス■■■■■■■■■■■■■←入力フォーム ●メルマガを受け取る ●受け取らない 上記のようにフォームの下にラジオボタンを追加で付けて「受け取る」 を選択した場合、別に用意したメルマガ用CGIにデータを送りたいと 考えているのですが、ひとつの情報を複数のCGIへ送る場合、どのよう にしたらよいのでしょうか? また、お客様情報を送信した後はショッピングカートの送信完了画面 を表示させたいのですが、使用したいと考えているメルマガCGIは登録 完了画面が表示されるタイプのCGIなので、メルマガCGIはデータを受け 取った後は何も表示させないようにしたいと考えております。 この場合のメルマガCGIにはどのように書き込めばよいのでしょうか? メルマガ用のCGIは http://www.netmania.jp/cgi/111.php のものを使 わせて頂こうと考えており、下記がメルマガCGIの登録部分の処理です。 -------------------------- sub readeradd { if ($QUERY{mail} eq "" || $QUERY{'mail'} !~ /(.*)\@(.*)\.(.*)/) {&main("メールアドレスが未記入です");} &readerload; foreach $list (@readerlist) { $newlist = $list; $newlist =~ s/\n//g; $newlist =~ s/\r//g; if($newlist eq $QUERY{mail}){&main("メールアドレス $QUERY{mail} は既に登録済みです");} } $value = "$QUERY{mail}\n"; push(@readerlist,$value); open(LOG,">$usrdata"); flock(LOG,2); print LOG @readerlist; flock(LOG,8); close(LOG); &main("メールアドレス $QUERY{mail} を登録しました<br>ご購読登録ありがとうございました"); -------------------------- 説明が分かりにくくて申し訳ありません。 よろしければご教授下さいますようお願い致します。
- ベストアンサー
- CGI
- テキストデータから一部の情報を抜き出して,別のテキストデータに書き出す
テキストデータから一部の情報を抜き出して,別のテキストデータに書き出す方法についてです.DOSの知識は皆無なのでトンチンカンな質問でしたらご容赦ください. 処理内容は例えば, 001_20100601.txt 002_20106002.txt 003_20100604.txt という中身のfilename_list.txtから001,002,003だけを抜き出して, 001 002 003 という中身のid_list.txtを作りたいです.ネットで調べながら自分なりに考えてみて以下のような記述で処理できました. del id_list.txt & for /F "tokens=1 delims=_" %a in (filename_list.txt) do @echo %a >>id_list.txt 質問は2点で,do @echo %a の意義(意味)というか処理内容が分からないので,それを理解したいということと,よりスマートな記述ができやしないかということです.前者についてはforの後には何らかの実行コマンドが必要だから無理やりつけている程度にしか理解できていません. よろしくお願いします. ※MATLABからコマンドプロンプトを動かして処理しているので,そんな回りくどいことしなくても,MATLABで直接この処理ができるようならその方法も知りたいです.
- ベストアンサー
- その他(プログラミング・開発)
- バッチファイル 文字列操作のやり方
お世話になります。 バッチファイルのコマンドについてですが、 for文の中で 一番下の階層のファイル名の先頭5バイトが "abcde"のものだけ処理対象にしたいと考えています。 例えば、 C:\tempに以下のファイルがあったら C:\temp\abcdefg.txt ・・・(1) C:\temp\xxxxxxx.txt ・・・(2) C:\temp\abcde.txt ・・・(3) C:\temp\abc.txt ・・・(4) C:\temp\abcdezzzz.txt ・・・(5) (1)、(3)、(5)だけを処理させたいと考えています。 実装方法として、以下を考えましたがうまくいきません。 dir /s /b /a-d C\Temp > file.txt for /f "delims=" %%F in (file.txt) do ( set A=%%~nF% if "%%A:~0,5%"=="abcde" ( <処理コマンド> ) ) おそらくfor文の中で何個も命令を記述できないということと、 パラメータ修飾子の指定が間違っているからだと思われますが、 うまくできない理由を知りたいです。 よろしくお願いいたします。
- ベストアンサー
- その他(ITシステム運用・管理)
- GETデータの&で区切った個々のエラー処理について質問です。
GETデータ、たとえば http://www.yahoo.co.jp/test.cgi?data1=1237&data2=AK とある場合、$ENV{'QUERY_STRING'}の中のそれぞれの引数値に個別にエラー処理をかける方法を教えてください。順番はdata2が先頭にくるときもあればdata1が先頭にくるときもあります。data以外の文字はだめです。たとえばcode1=となるとエラーになるようにしたい。data1には数字4文字が入ります。data2には大文字の英字が入ります。 組み合わせはdata1=8544だけのときもありますし、 data1=1234&data2=KOのときもあったりばらばらです。 逆の場合もあります。data2=KO&data1=1234というふうに・・・。$ENV{'QUERY_STRING'} を&で分割して@getにいれてから、@getから&で区切られた個々の値を取り出す方法がわかりません。。。 どなたかご教授ねがいます。よろしくお願いいたします。以下のように書いたのですがうまくできません。 sub err_check{ if ( $FORM{'action'} eq "" ) { local(@get); if($ENV{'QUERY_STRING'} !~ /data1|data2|data3/) { &err2; } if (length($ENV{'QUERY_STRING'}) > 30) { &err2; } (@get)=split(/&/,$ENV{'QUERY_STRING'}); foreach $getname (@get) { ##data1のとき if ($data1){ if ($getname !~ /^media=[0-9]+[0-9]+[0-9]+[0-9]/) { &err2; } if (length($data1) > 6) { &err2; } if (length($data1) < 4) { &err2; } } ##data2のとき if($data2){ if ($getname !~ /^data2=[A-Z]+[A-Z]/) { &err2; } if (length($data2) ne 2) { &err2; } } } }
- ベストアンサー
- Perl
- チェックが入っていなかったら処理を行いたい
いつもお世話になっております。 只今チェックボックスにチェックが入っていなかったらチェックを入れるという処理を Javascript、JQueryで行いたいのですが上手く動作せずに困っております。 if ( $( 'input:checkbox[name="tax_input[pick-up][]"]' ).is( 'checked' ) == false ) { jQuery('input:checkbox[name="tax_input[pick-up][]"]').removeAttr ( 'checked' ); jQuery('input:checkbox[name="tax_input[pick-up][]"]:eq(3)').attr ( 'checked', 'checked' ); } 上記のソースで試したのですが反応が全くありませんでした。 if( $( 'input:checkbox[value="98"]' ).is( ':checked' ) ) { jQuery('input:checkbox[name="tax_input[pick-up][]"]').removeAttr ( 'checked' ); jQuery('input:checkbox[name="tax_input[pick-up][]"]:eq(2)').attr ( 'checked', 'checked' ); } チェックが入っている場合の判定ですが上記の場合は動きました。 記述ミス、根本的に書き方が違うなどございましたらご指摘ください。 ご回答のほどどうぞよろしくお願い致します。
- 締切済み
- JavaScript
- データ重複をチェックし、特定のデータを照合
エクセル2003で、メルマガリストを管理しています。(データはA列にお客様名、B列にメールアドレスです。これは昨年3月に作成したものでデータ数が4000ぐらいあります。) これを元にメールアドレスのみのデータを別ファイルで作成し、メルマガの配信リストを作成しました。(A列にメルアドのみ) 時がたつにつれ、削除依頼等でメールアドレスのみのデータは、現在2000近くまでに減りました。最近、新しい配信サービスソフトに加入し、そこでは名前とメールアドレスで登録することができるので、オリジナルの4000人の顧客名とメールアドレスのデータと、現在のメルアドのみの2000人の物を照合して、同じメールアドレスがあれば2000人のデータに顧客名を引っ張るにはどういう関数をいれればよいのでしょうか? わかりづらい説明で申し訳ございませんが、宜しくお願いします。
- ベストアンサー
- その他MS Office製品
- VB.NET SPRED(チェックボックスの処理)
.net初心者です。スプレッドを扱うのも始めてで調べてもわからないので教えて頂けないでしょうか? (行いたい処理) スプレッド上のチェックボックスにチェックを入れたものの行データを取得。 下のような感じでテストプログラムを作りました。 spd_LIST.SaveChanges() For I = 0 to 5 If spd_LIST.Seet(0).Cell(I,0).Value = 1 Then (行データ取得処理) Else (処理なし) End if Next チェックボックスにチェックが入っていればデータを取得できますがチェック無しの行の処理に入った場合エラーで落ちてしまいます。 他の方法が思いつかないため、やり方に間違いがあるようでしたら教えていただきたいです。宜しくお願いします。
- 締切済み
- Visual Basic
- シェル ファイルの中身によって特定の処理
シェルスクリプトに関する質問です。 少しシェルで言語風なものを作ってみようと思い、作成したのですが、上手くいかないので質問させて頂きました。内容は、特定の文字がファイルに記載されているか判定して、 特定の文字だったら処理をするというものです。 現在、このようなソースになっています↓ #!/bin/sh - #ファイルを設定(仮) file_name="dummy.sh" #行数を変数へ格納 line=$(wc -l ${file_name}) #行数をlog.txtへ書き込む echo ${line} > log.txt #行数以外にファイル名があるので削除 sed -i "s/$file_name//g" log.txt #行数を格納 Line=$(cat log.txt) i=0 #全ての行を変数へ格納 #ここが問題 配列に変数が使えない!? while [ $i = ${Line} ] do array[$i]=$(sed -n "${i}p" ${file_name}) expr `${i} + 1` done # 格納した変数をチェックして、 # 指定された文字(hello)が書かれていればhelloと表示させる b=0 while [ $b = ${main_file} ] do if [ array[$b] = "hello" ] then echo "hello" fi expr `$b + 1` done ここで、配列を利用し、変数への代入が出来ませんでした。 ただ、エラーは表示されません。。。 環境はUbuntu10.10です。 何もいじっていないので、たぶん大丈夫だと思うんですが・・・ 何か解決策はありませんか? また、コレよりいい方法などがあればぜひ教えてください。
- 締切済み
- その他(プログラミング・開発)
- 空文字のエラーチェック(問い合わせフォーム)について
宜しくお願いします。 書籍を参考にして、PHPにて問い合わせフォームを作成しております。 初心者のレベルです。 問い合わせフォームに入力されたデーターの、 エラーチェック処理について、1点不明なところがあり、質問させて頂きます。 コメント入力欄があり、そこは1000文字以内で必須入力してもらいます。 そのためエラーチェックとして、下記のコードが書籍にあります。 function erro_check($check_data){ if(isset($check_date["comment"]) && $check_date["comment"]= = ="") { $error_list[ ]="コメントを入力してください。"; }elseif(trim($check_date["comment"]) = = =""){ $error_list[ ]="コメントを入力して下さい。"; }elseif(mb_strlen($check_date["comment"]) > 1000){ $error_list[ ]="コメントは1000文字以内で入力してくださ い。"; } return $error_list; } 空文字入力のチェックが二度にわたって行われているような気がします。最初のif判定だけで、十分なような気が・・・。 もしくは、 if(isset($check_data["commento"]) && trim($check_data["comment"]) === ""){ ... } とすればいいのでは?と。。。 でも書籍の中のコードは、何か意味があってのものだと思います。 どなたか宜しくご教授くださいませ。 お願いします。
- ベストアンサー
- PHP