では実際にスクリプトを記述してみましょう。
#!/usr/local/bin/perl
##### パラメータ受け取り
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($key, $value) = split(/=/, $pair);
$form{$key} = $value;
}
$digit = $form{'digit'};
$up = $form{'up'};
##### カウントファイル読み込み
open(READ, "$count_file") || die "error";
$count = <READ>;
close(READ);
##### カウントする
if ($up == 1) {
$count++;
##### カウントファイルを書き込む
open(WRITE, "> $count_file") || die "error";
print WRITE $count;
close(WRITE);
}
##### パラメータ解析
$img = ($count/(10**($digit-1)))%10;
##### 出力
open(IMG, "$img\.gif") || die "error";
print "Content-type: image/gif\n\n";
binmode(IMG);
binmode(STDOUT);
print <IMG>;
close(IMG);
exit;
■ パラメータ受け取り
何桁目の数値をGIFファイルとして出力するのかを受け取ります。
■ $up==1 という条件
例えば、5桁のカウンタを出力する場合、CGIが5回呼び出されることになります。毎回カウントを行うと1回のアクセスでカウンタが+5されてしまいます。そこで、upパラメータが1のときにカウンタをアップするような仕組みにします。
■ パラメータ解析
digitの示す桁数の数値を取得します。
■ 出力
出力対象となるGIFファイルをオープンし、バイナリモードで標準出力に出力します。Content-Type は image/gif となります。