カウンターで重複カウントの防止について
BY u2122 / DATE 2010-05-20 11:20:27 / ID 1301 / VIEW 1071
カウンターで重複カウントの防止について
勉強がてら以下のようなカウンターをつくりたいと思っています。
1 画像つきのカウンタである
2 重複カウンタを防止したい
3 昨日と今日のカウンターも表示させたい

で、2でけつまずきました。
何がいけないのでしょうか?
以下のプログラムだと更新毎にカウンターが回ってしまいます。
ご指摘下さい。よろしくお願い申し上げます。

#!C:Perlinperl

$flg = 0;

#IPアドレスの取得と重複カウントの防止============
$ipadd = $ENV{'REMOTE_ADDR'}; #IPアドレスの取得

open (FILE, "<logcount.dat") || die "File Open Err!-logcount.dat
"; #データをすべて配列logdataに読み込む
@logdata = <FILE>;
close(FILE);

#取得したIPアドレスと履歴のIPアドレスを比較======
for($i=0; $i<=$#logdata; $i++){
if($ipadd eq $logdata[$i]){ #新規のIPデータと過去ログのIPデータが等しかったら
$flg = 1; #合致するのは1つのアドレスのみ
}
}

#====================================================================
# $flg = 0 だったら、数をカウント
#====================================================================
open(FILE,"<count.dat") || die "File Open Error!-count.dat
"; #カウントデータの読み込み
$count = <FILE>; #変数countにデータを収納
close(FILE);


if($flg == 1){
$data = $count;
}else{
$data = ++$count; #プラス1をカウント

# ログの更新==================================
open(FILE, "+<count.dat") || die "File Open Error!
";
flock(FILE,2);

seek(FILE, 0, 0); #.datに上書き保存する為にデータの記位置を調整
print FILE $data; #カウントを記録

flock(FILE,8);
close(FILE);


# IPアドレスを更新=============================
open (FILE, ">>logcount.dat") || die "File Open Err!-logcount.dat
";
print FILE $ipadd,"
";
close(FILE);
}
print $data;


#====================================================================
# カウンタの数字に画像を付ける
#====================================================================
@count = split(//, $data);
foreach $cou(@count){
push(@view, "./img/$cou.gif");
}

require "./gifcat.pl";
print "Content-type:image/gif

";
binmode(STDOUT);
print &gifcat::gifcat(@view);
kumozさんからのお返事です
ID:1302 POST:2010-05-20 11:20:38
> if($ipadd eq $logdata[$i]){ #新規のIPデータと過去ログのIPデータが等しかったら
> $flg = 1; #合致するのは1つのアドレスのみ
> }

@logdata の各要素に改行が付いたままなので、上の条件式が成立することはないと思います。
事前に chomp @logdata; とでもする必要があります。また、その後の $count も改行の処理が
してないようなので、見直す必要があるように思います。