
フォームから入力された文字列をデータファイルの中から検索し、重複していなければ追加登録したい。
・問題点
重複していても登録できてしまう。
昨日からperlを触り始めたばかりなので、基本的な部分が分かっておらず、
おかしい部分が多々あるかもしれませんが、ご指導よろしくお願い致します。
データは全て"["から始まるので、登録できませんの部分は、簡単な入力チェックです。
--------------------------------------------
test.html
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="test2.cgi" method="post">
<input type="text" name="shirolist" size="50" />
<input type="submit" name="submit" value="送信" />
</form>
</body>
</html>
--------------------------------------------
test2.cgi
#!/usr/local/bin/perl
use utf8;
use CGI;
$q = new CGI;
$flag = 0;
$data = $q -> param('shirolist');
$data =~ s/\s+//g;
open(IN , "<:uft8" , "data.dat");
while($line=<IN>){
if ( $line eq $data ) {
$flag = 1;
}
}
close(IN);
if($flag == 0){
if ($data =~ /^\[/) {
open(OUT,">>data.dat");
print OUT "$data\n";
close(OUT);
$pr="を登録しました";
}
else {
$pr="は登録できません";
}
} else {
$pr="は登録済みです";
}
print "Content-Type: text/html; charset=UTF-8\n";
print "$data $pr<br>\n";
※Yahoo知恵袋で同様の質問をしましたが、
回答者への個別のコメントや追加質問が出来ず、
非常に使いづらく感じたのでこちらに投稿させて頂きました。
No.1ベストアンサー
- 回答日時:
> while($line=<IN>){
<> (ダイヤモンド演算子) では、改行コードも含めて入力されます。
よって、
$line = "でーた\n"
としたような状態になっています。
$data にはformから入力したので、改行コードは付いていません。
これでは絶対に一致しません。
while($line=<IN>){
chomp $line ;
if ( $line eq $data ) {
$flag = 1;
}
}
という感じに、chomp関数を使うなど、改行コードを削除するのが,Perlでの常套手段です。
あとは、細かいことになりますが
> open(IN , "<:uft8" , "data.dat");
戻り値を確認して、エラーのときは、適切な処理をするようにしましょう。
> open(OUT,">>data.dat");
INでは3引数で使ってるのですから、OUTの方も3引数使っては?
エラー処理も入れましょう。
ただ、このままだと、同時にアクセスがあったときに、不具合が発生する可能性があります。
「perl 排他制御」で検索して、調べてください。
今回の場合だったら
'+<' で読み書き用でopen→flock等の排他処理→読み込み→(closeはしない)→seekで末尾に→追記→close
というのが常套手段でしょう。
> print "Content-Type: text/html; charset=UTF-8\n";
> print "$data $pr<br>\n";
HTTPのヘッダは、空行で区切りです。\nで改行するなら、\n\nと改行だけの行が必要です。
その後もHTMLとしては変ですが、それはとりあえず置いておきます
色々とご指摘ありがとうございました。勉強になりました。
重複登録も無事に判別できるようになり解決しました。
次は検索のプログラムを頑張ってみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
batファイルでrenameができませ...
-
Windowsで複数のファイルを同じ...
-
vba dir の相対パス
-
エクセルVBA コードが同じでも...
-
VBAで巨大なファイルの途中から...
-
where can I buy snowbord in t...
-
バッチファイルの作り方(CSV→...
-
改行コードが勝手に
-
フォルダの中身を知りたい
-
LinuxのC言語で、ファイル名の...
-
コマンド「dir」の結果を、テキ...
-
VBAでCSVファイルを途中行まで...
-
ReadLineでの読み出し行を指定する
-
ExcelをCSV書き出す場合のシー...
-
複数ファイルの読み込みについて
-
awkスクリプトでダブルクォーテ...
-
ディレクトリの判別
-
VB6.0でDB接続する際に切断時の...
-
ディレクトリ名を取得したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perlでcsvファイルを読む(ダブ...
-
Perlで特定行から特定行までを...
-
CSVファイルのデータの行数を取...
-
Perlを利用してテキストフ...
-
Perlの初心者です。2重ループ...
-
ディレクトリ内のtxtファイル中...
-
MATLAB std::exceptionエラー
-
Argument "\\\\n" isn't numeri...
-
パターンマッチングにおいて変...
-
郵便番号辞書のアップデート手...
-
Perlで空白行を削除
-
Perl 順位の重複
-
エクセルVBA コードが同じでも...
-
Windowsで複数のファイルを同じ...
-
batファイルでrenameができませ...
-
C言語で特定の行を抽出する方法...
-
VBAでCSVファイルを途中行まで...
-
MATLAB グローバル変数の宣言
-
パスから最後のディレクトリだ...
-
vba dir の相対パス
おすすめ情報