3D Give & Take
Perl
 
[Gallery] [Making] [DownLoad] [Link]
[Trash Gallery] [Introduction] [BBS] [▲TOP]
Perl 投票数を数える
項目 説明
アンケートに答えてもらった内容を集計するときにひとつずつ数えるのも別にいいのですが、当然ながら量が増えるととてもではないですが、面倒なのと厳密に集計しなければならないときなどは、不便です。

そこでCやC++よりももっと手軽なPerlでやってみたいと思います。
Perlの歴史や文法などはほかのサイトの方がもっとしっかりしていますので、基礎部分は省きます。また間違ったかきかたや無駄な処理をしているかもしれません。そのときはすいません。
なお私は青倉克浩(AOK)さんのASPERL.EXEを使用しています。これはWindowsで使用するには快適です。

下のようなCSVデータあるとします。
日付,なにもない,名前
となっています。ここで名前が何種類あり、何回あるかを集計したいとします。
-----
Thu Jun 7 20:57:37 2001,,Aya
Thu Jun 7 22:28:07 2001,,misa_bust
Sun Jun 10 23:34:08 2001,,misa_bust
Mon Jun 11 08:45:26 2001,,sae_2
Tue Jun 19 14:49:03 2001,,sae_2
Tue Jun 19 14:49:25 2001,,misa_bust

なお行末は改行がはいっています。

open(IN,"output.dat");
@xx=<IN>;
$_=0;
$i=0;
$n=0;
foreach $list (@xx){
 ($data,$tmp,$name)=split(/,/,$list);
 $a_listdata[$_]=$data;
 $a_listname[$_]=$name;
 $_++;
}



CSVからのデータ読みこみます。
output.datを開き、カンマをそれぞれの配列に格納していきます。ここで@は配列の意味です。なお$a=@xxとすると配列数が入ります。文字列は入ってきません。
文字の結合は.どっとです。
$a="aaa";
$b="bbb";
$c=$a.$b;
print "$c\n";
>aaabbb
になります。

 

$count=@a_listname;
for($_=0;$_<=$count;$_++){ 
 $tmp=$a_listname[$_];
 $icount=@name;
 for($i=0;$i<=$icount;$i++){
  if($tmp eq $name[$i]){
   $flag=0;
   last;#forを抜ける
  }else{
   $flag=1;
  }
 }
#ここにくるときに$iがさらに加算されるのかな
#
   if($flag==1){
    $flag=0;
    $i-=1;#forの処理のために引く
    $name[$i]=$tmp;
   }
}

いくつかの行の解説は省きますが、ここでは名前が配列にはいっているなかから、名前の一覧を取得します。単純に2重ループによる総当りです。同じ名前がないときはnameに入れるです。
意外と時間がかかりました。(3日も)

###########################
#キャラクタの投票回数を取得
###########################
foreach $_(@name){
 $characount=0;
 $listcount=@a_listname;
 $_=~s/\n//g;#改行を削除
 for($i=0;$i<=$listcount;$i++){
  if($a_listname[$i] =~/$_/){ #キャラの回数を探る。
   $characount++;
  }
 } 
 $output{$_}=$characount;#連想配列
}

名前の一覧が取得できたので、再度総リストから検索して回数を数えます。あと連想配列をつかってます。特に意味はないです。
while(($outputname, $outputcount) = each(%output)){#連想配列よる出力
 $graph=$outputcount*10;
 print "<tr><td>$outputname</td><td>:$outputcount:<img src=\"http://homepage2.nifty.com/maseda/img/dot.gif\" height=10 width=$graph></td></tr>\n";
}
連想配列は%で表すようです。
以下全リスト  
#!/usr/local/bin/perl
#履歴
#■020203

open(IN,"output.dat");
@xx=<IN>;
$_=0;
$i=0;
$n=0;
foreach $list (@xx){
 ($data,$tmp,$name)=split(/,/,$list);
 $a_listdata[$_]=$data;
 $a_listname[$_]=$name;
 $_++;
}
$lastinput=$a_listdata[$_-2];
$lastinput=~s/<br>//g;#<br>を削除する
close(IN);

#############################################
#どのキャラクタが投票されたかキャラクタの一覧を取得する。
#なお投票されていないと取得はできない。
###########################################
$count=@a_listname;
for($_=0;$_<=$count;$_++){ 
 $tmp=$a_listname[$_];
 $icount=@name;
 for($i=0;$i<=$icount;$i++){
  if($tmp eq $name[$i]){
   $flag=0;
   last;
  }else{
   $flag=1;
  }
 }
#ここにくるときに$iがさらに加算されるのかな
#
   if($flag==1){
    $flag=0;
    $i-=1;#forの処理のために引く
    $name[$i]=$tmp;
   }
}

###########################
#キャラクタの投票回数を取得
###########################
foreach $_(@name){
 $characount=0;
 $listcount=@a_listname;
 $_=~s/\n//g;#改行を削除
 for($i=0;$i<=$listcount;$i++){
  if($a_listname[$i] =~/$_/){ #キャラの回数を探る。
   $characount++;
  }
 } 
 $output{$_}=$characount;#連想配列
}

##########htmlアウトプット
print"Content-type:text/html\n\n";
print"<html><head><title>投票結果</title></head>";
print"<body>投票結果 最新投票日($lastinput)<br>\n";
print"投票ありがとうございました。<br>\n";
print"<a href=http://homepage2.nifty.com/maseda/gallery.html>戻る</a><br><br>\n";
print "<table border=0>\n";
print "<tr><td>キャラクター名</td><td>投票数</td></tr>\n";
while(($outputname, $outputcount) = each(%output)){#連想配列よる出力
 $graph=$outputcount*10;
 print "<tr><td>$outputname</td><td>:$outputcount:<img src=\"http://homepage2.nifty.com/maseda/img/dot.gif\" height=10 width=$graph></td></tr>\n";
}
print "</table>\n";
print "</body></html>\n";
exit;

 


copyright(c)2002 maseda all rights reserved.