電子書籍の厳選無料作品が豊富!

フォームから入力された文字列をデータファイルの中から検索し、重複していなければ追加登録したい。

・問題点
重複していても登録できてしまう。

昨日から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知恵袋で同様の質問をしましたが、
回答者への個別のコメントや追加質問が出来ず、
非常に使いづらく感じたのでこちらに投稿させて頂きました。

A 回答 (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としては変ですが、それはとりあえず置いておきます
    • good
    • 0
この回答へのお礼

色々とご指摘ありがとうございました。勉強になりました。
重複登録も無事に判別できるようになり解決しました。

次は検索のプログラムを頑張ってみようと思います。

お礼日時:2013/01/12 08:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!