#!/usr/bin/perl %ranking=(); $line=0; %icons=( 'bear.gif', 'くま', 'cat.gif', 'ねこ', 'cow.gif', 'うし', 'dog.gif', 'いぬ', 'fox.gif', 'きつね', 'hituji.gif', 'ひつじ', 'monkey.gif', 'さる', 'mouse.gif', 'ねずみ', 'pig.gif', 'ぶた', 'usagi.gif', 'うさぎ', 'zou.gif', 'ぞう', ); open(IN, "yybbs.log"); while () { if ($line > 0) { chop; @a = split('<>'); if ($a[11] ne "gecko.gif") { $ranking{$a[11]} += 1; } } $line += 1; } # http://www2t.biglobe.ne.jp/~mitsui/perl/sample/basic/Source/hash_sort_V.html #連想配列のキーを対象としたソートは良く参考書に出ていますが #値を対象としたソートはちょっと難しい。 #ここに下記の連想配列があるとします。 #これを値段の高い順に並べ替えるのは次の様にします。 #一旦全ての値を取り出し、配列に無名ハシュで今度はキー、値、ハッシュに展開してます。 #(大きなハッシュを細切れにします。) while (($k,$v) = each %ranking) { push (@so,{ icon => $k, count => $v }); } #次にFOR文で配列の全てをSORTします。 #Sort文に値を渡すとき、さっき展開した配列のキーを渡します。(実はキーを渡すことは{**}するので値で評価されます。) #それからSORTで得られたリファレンス値を適当な変数に保存し、$$変数名{キー}で中身を得ます。 print "Content-type: text/html\n\n"; print <<"EOM"; Ranking

EOM for $num (sort { ($b->{count}) <=> ($a->{count}) } @so) { $tmp1 = $$num{icon}; $tmp2 = $$num{count}; $tmp3 = $icons{$tmp1}; $rn = 1; foreach (@so) { $rn += 1 if ($$_{count} > $$num{count}); } print "\n"; }; print "
$rn$tmp3($tmp2 票)
\n"; print "

戻る

\n"; print "\n\n"; # End