※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。
■ アクセスログ集計表を作る
それでは最後に「アクセスログ集計表」を作成してみます。
アクセスログに記録した内容を読み取り、その値が同じものを集計する方法です。
本来、このような処理はデータベースの領域ですが、Perlでもその手法により可能です。
今回はその中から、「エージェント」別に集計する方法を解説します。
このCGIは以前作成した、「アクセスログを表組みで表示する」を利用します。
いつものことですが、
この処理を理解するには当然ですが、「HTML」の知識が必要になります。
解からない方は「HTMLの解説」で勉強してくださいね。
- 【 解 説 】
-
まず、以前と同じようにファイルからアクセスログデータを「@flist」という変数にセットしておきます。
$filnam = "acclogf.cgi"; open(FP,"<$filnam"); @flist = <FP>; close(FP);次にこの「@flist」を順に読み出しながら「,(カンマ)」区切りで分解し、「エージェント」をキーとしたハッシュを作り、その変数に「1」を加算していきます。
キーが同じものは、次々「1」が加算され、最終的に「エージェント」単位に集計したカウント数を取得することができます。
その方法は次のように記述できます。
foreach $strdat (@flist){ @strbuf = split(/,/, $strdat); $key = $strbuf[3]; $cntsum{$key}++; }この処理により取得されたハッシュ「%cntsum」をそのままテーブル(表組み)で表示すればいいのです。
今回の項目数は集計項目である「エージェント」と「カウント数」の2項目になります。
では、上記の内容のように変更した「アクセスログ集計表」は次のようになります。
- 【記述サンプル】
-
#!/usr/bin/perl
$filnam = "acclogf.cgi"; open(FP,"<$filnam"); @flist = <FP>; close(FP);
foreach $strdat (@flist){ @strbuf = split(/,/, $strdat); $key = $strbuf[3]; $cntsum{$key}++; }
print << "END_OF_DOC"; <table border='1'> <tr> <th>エージェント</th> <th>カウント</th> </tr> END_OF_DOC
foreach $key (keys %cntsum){ print "<tr>\n"; print "<td>$key</td>\n"; print "<td>$cntsum{$key}</td>\n"; print "</tr>\n"; } print "</table>\n";