ルモーリン
ホーム 更新 Perl Sample サービス 雑談 鉄ゲタ Linux リンク 連絡先

他者のPerlを書き替える~2~

2019-12-13

解説

これの第2弾。
他者のPerlを書き替える - Perl - ルモーリン

問題

このサンプルを書き替えるとどうなりますか?

## ランキング表示
sub rank{

#open (RL,"$rank_log") || &error("Can't open $rank_log");
sysopen (RL,"$rank_log",O_RDONLY | O_CREAT) || &error("Can't open $rank_log");
@hd_rank = <RL>;
close(RL);

foreach $hd_rank(@hd_rank){
$hd_rank =~ s/\n//;
($name,$cnt,$cg_cnt,$bgm_cnt,$flash_cnt,$res_cnt,$pass,$la,$rest_cnt,$mcr_cnt) = split(/<>/,$hd_rank);
if($cnt){$rank{$name} = $cnt;}
$cg_rank{$name} = $cg_cnt;
$bgm_rank{$name} = $bgm_cnt;
$flash_rank{$name} = $flash_cnt;
$res_rank{$name} = $res_cnt;
$rest_rank{$name} = $rest_cnt;
$mcr_rank{$name} = $mcr_cnt;

}

@sort_rank = sort {$rank{$b} <=> $rank{$a}} keys(%rank);
foreach(@sort_rank){++$num;$all_num = $all_num + $rank{$_};}

header($config, bg_img => $bg_img);
print <<EOM;
<a name=top>[<a href=$script?cnt=no>掲示板に戻る</a>]</a>
<br>
<center><font color=\"$t_color\" size=6 face=\"$t_face\"><b><SPAN>貼\り逃げだ~び~</SPAN></b></font><br><br>
<a name=all><br></a>
<table width=\"80%\"><tr><td>
<font color=blue size=+1 face=\"$t_face\">現在の萌え総数 $all_num だ~び~参加人数 $num人</font><br><br>
<table width="100%"><tr><td><b>※このランキングは総合貼\りランキングです(w</b></td><td align=right><a href=#cg>画像</a> <a href=#bgm>BGM</a> <a href=#flash>Flash</a> <a href=#res>レス</a> <a href=#rest>編集</a> <a href=#mcr>マクロ</a> <a href=#top>TOPに戻る</a></td></tr></table></td></tr></table>
<table width="80%" border=1 cellspacing=0>
<tr><th>順位</th><th>お名前</th><th nowrap>萌え度</th><th>萌えぱ~せんて~じ</th></tr>
EOM

foreach(@sort_rank){
++$rk;
	if($nex_jg == $rank{$_}){
		if($next_num){
		$ex_num = $next_num;
		}else{
		$next_num = $rk; $ex_num = --$next_num;
		}
	}else{
	$next_num=0;$ex_num = $rk;
	}

$nex_jg = $rank{$_};
$per = int((($rank{$_}/$all_num)*100)+0.5);
if(!$per){$per=1;}
$gif_w =int($rank{$_}*$g_width);if(!$gif_w){$gif_w=1;}
print"<tr><td>$ex_num</td><td><b>$_</b></td><td><b>$rank{$_}</b></td><td nowrap><img src=$icon_dir\graph.gif height=\"12\" width=\"$gif_w\"> $per\%</td></tr>";
}

print"</table>";
print "<table width=\"80%\"><tr><td>お名前の@、@、☆、★以下は省略されます</td></tr></table><br>";

$ex_num = $rk = $nex_jg = $next_num = $num = $all_num = 0;

@sort_rank = sort {$cg_rank{$b} <=> $cg_rank{$a}} keys(%cg_rank);
foreach(@sort_rank){if($cg_rank{$_}){++$num;$all_num = $all_num + $cg_rank{$_};}}

print <<EOM;
<a name=cg><br></a>
<table width=\"80%\"><tr><td>
<font color=blue size=+1 face=\"$t_face\">現在の萌え画像総数 $all_num だ~び~参加人数 $num人</font><br><br>
<table width="100%"><tr><td><b>※このランキングは貼\り画像ランキングです(w</b></td><td align=right><a href=#all>総合</a> <a href=#bgm>BGM</a> <a href=#flash>Flash</a> <a href=#res>レス</a> <a href=#rest>編集</a> <a href=#mcr>マクロ</a> <a href=#top>TOPに戻る</a></td></tr></table></td></tr></table>
<table width="80%" border=1 cellspacing=0>
<tr><th>順位</th><th>お名前</th><th nowrap>萌え度</th><th>萌えぱ~せんて~じ</th></tr>
EOM

foreach(@sort_rank){
++$rk;
	if($nex_jg == $cg_rank{$_}){
		if($next_num){
		$ex_num = $next_num;
		}else{
		$next_num = $rk; $ex_num = --$next_num;
		}
	}else{
	$next_num=0;$ex_num = $rk;
	}

$nex_jg = $cg_rank{$_};
$per = int((($cg_rank{$_}/$all_num)*100)+0.5);
if(!$per){$per=1;}
if($cg_rank{$_}){
$gif_w =int($cg_rank{$_}*$g_width);if(!$gif_w){$gif_w=1;}
print"<tr><td>$ex_num</td><td><b>$_</b></td><td><b>$cg_rank{$_}</b></td><td nowrap><img src=$icon_dir\graph.gif height=\"12\" width=\"$gif_w\"> $per\%</td></tr>";
}
}

print"</table>";
print "<table width=\"80%\"><tr><td>お名前の@、@、☆、★以下は省略されます</td></tr></table><br>";

$ex_num = $rk = $nex_jg = $next_num = $num = $all_num = 0;

@sort_rank = sort {$bgm_rank{$b} <=> $bgm_rank{$a}} keys(%bgm_rank);
foreach(@sort_rank){if($bgm_rank{$_}){++$num;$all_num = $all_num + $bgm_rank{$_};}}

print <<EOM;
<a name=bgm><br></a>
<table width=\"80%\"><tr><td>
<font color=blue size=+1 face=\"$t_face\">現在の萌えBGM総数 $all_num だ~び~参加人数 $num人</font><br><br>
<table width="100%"><tr><td><b>※このランキングは貼\りBGMランキングです(w</b></td><td align=right><a href=#all>総合</a> <a href=#cg>画像</a> <a href=#flash>Flash</a> <a href=#res>レス</a> <a href=#rest>編集</a> <a href=#mcr>マクロ</a> <a href=#top>TOPに戻る</a></td></tr></table></td></tr></table>
<table width="80%" border=1 cellspacing=0>
<tr><th>順位</th><th>お名前</th><th nowrap>萌え度</th><th>萌えぱ~せんて~じ</th></tr>
EOM

foreach(@sort_rank){
++$rk;
	if($nex_jg == $bgm_rank{$_}){
		if($next_num){
		$ex_num = $next_num;
		}else{
		$next_num = $rk; $ex_num = --$next_num;
		}
	}else{
	$next_num=0;$ex_num = $rk;
	}

$nex_jg = $bgm_rank{$_};
$per = int((($bgm_rank{$_}/$all_num)*100)+0.5);
if(!$per){$per=1;}
if($bgm_rank{$_}){
$gif_w =int($bgm_rank{$_}*$g_width);if(!$gif_w){$gif_w=1;}
print"<tr><td>$ex_num</td><td><b>$_</b></td><td><b>$bgm_rank{$_}</b></td><td nowrap><img src=$icon_dir\graph.gif height=\"12\" width=\"$gif_w\"> $per\%</td></tr>";
}
}

print "</table>";
print "<table width=\"80%\"><tr><td>お名前の@、@、☆、★以下は省略されます</td></tr></table><br>";

$ex_num = $rk = $nex_jg = $next_num = $num = $all_num = 0;

@sort_rank = sort {$flash_rank{$b} <=> $flash_rank{$a}} keys(%flash_rank);
foreach(@sort_rank){if($flash_rank{$_}){++$num;$all_num = $all_num + $flash_rank{$_};}}

print <<EOM;
<a name=flash><br></a>
<table width=\"80%\"><tr><td>
<font color=blue size=+1 face=\"$t_face\">現在の萌えFlash総数 $all_num だ~び~参加人数 $num人</font><br><br>
<table width="100%"><tr><td><b>※このランキングは貼\りFlashランキングです(w</b></td><td align=right><a href=#all>総合</a> <a href=#cg>画像</a> <a href=#bgm>BGM</a> <a href=#res>レス</a> <a href=#rest>編集</a> <a href=#mcr>マクロ</a> <a href=#top>TOPに戻る</a></td></tr></table></td></tr></table>
<table width="80%" border=1 cellspacing=0>
<tr><th>順位</th><th>お名前</th><th nowrap>萌え度</th><th>萌えぱ~せんて~じ</th></tr>
EOM

foreach(@sort_rank){
++$rk;
	if($nex_jg == $flash_rank{$_}){
		if($next_num){
		$ex_num = $next_num;
		}else{
		$next_num = $rk; $ex_num = --$next_num;
		}
	}else{
	$next_num=0;$ex_num = $rk;
	}

$nex_jg = $flash_rank{$_};
$per = int((($flash_rank{$_}/$all_num)*100)+0.5);
if(!$per){$per=1;}
if($flash_rank{$_}){
$gif_w =int($flash_rank{$_}*$g_width);if(!$gif_w){$gif_w=1;}
print"<tr><td>$ex_num</td><td><b>$_</b></td><td><b>$flash_rank{$_}</b></td><td nowrap><img src=$icon_dir\graph.gif height=\"12\" width=\"$gif_w\"> $per\%</td></tr>";
}
}

print "</table>";
print "<table width=\"80%\"><tr><td>お名前の@、@、☆、★以下は省略されます</td></tr></table><br>";

$ex_num = $rk = $nex_jg = $next_num = $num = $all_num = 0;

@sort_rank = sort {$res_rank{$b} <=> $res_rank{$a}} keys(%res_rank);
foreach(@sort_rank){if($res_rank{$_}){++$num;$all_num = $all_num + $res_rank{$_};}}

print <<EOM;
<a name=res><br></a>
<table width=\"80%\"><tr><td>
<font color=blue size=+1 face=\"$t_face\">現在の萌えレス総数 $all_num だ~び~参加人数 $num人</font><br><br>
<table width="100%"><tr><td><b>※このランキングはレスランキングです(w</b></td><td align=right><a href=#all>総合</a> <a href=#cg>画像</a> <a href=#bgm>BGM</a> <a href=#flash>Flash</a> <a href=#rest>編集</a> <a href=#mcr>マクロ</a> <a href=#top>TOPに戻る</a></td></tr></table></td></tr></table>
<table width="80%" border=1 cellspacing=0>
<tr><th>順位</th><th>お名前</th><th nowrap>萌え度</th><th>萌えぱ~せんて~じ</th></tr>
EOM

foreach(@sort_rank){
++$rk;
	if($nex_jg == $res_rank{$_}){
		if($next_num){
		$ex_num = $next_num;
		}else{
		$next_num = $rk; $ex_num = --$next_num;
		}
	}else{
	$next_num=0;$ex_num = $rk;
	}

$nex_jg = $res_rank{$_};
$per = int((($res_rank{$_}/$all_num)*100)+0.5);
if(!$per){$per=1;}
if($res_rank{$_}){
$gif_w =int($res_rank{$_}*$g_width);if(!$gif_w){$gif_w=1;}
print"<tr><td>$ex_num</td><td><b>$_</b></td><td><b>$res_rank{$_}</b></td><td nowrap><img src=$icon_dir\graph.gif height=\"12\" width=\"$gif_w\"> $per\%</td></tr>";
}
}
print "</table>";
print "<table width=\"80%\"><tr><td>お名前の@、@、☆、★以下は省略されます</td></tr></table>";

$ex_num = $rk = $nex_jg = $next_num = $num = $all_num = 0;

@sort_rank = sort {$rest_rank{$b} <=> $rest_rank{$a}} keys(%rest_rank);
foreach(@sort_rank){if($rest_rank{$_}){++$num;$all_num = $all_num + $rest_rank{$_};}}

print <<EOM;
<a name=rest><br></a>
<table width=\"80%\"><tr><td>
<font color=blue size=+1 face=\"$t_face\">現在の萌え編集総数 $all_num だ~び~参加人数 $num人</font><br><br>
<table width="100%"><tr><td><b>※このランキングは編集ランキングです(w</b></td><td align=right><a href=#all>総合</a> <a href=#cg>画像</a> <a href=#bgm>BGM</a> <a href=#flash>Flash</a> <a href=#res>レス</a> <a href=#mcr>マクロ</a> <a href=#top>TOPに戻る</a></td></tr></table></td></tr></table>
<table width="80%" border=1 cellspacing=0>
<tr><th>順位</th><th>お名前</th><th nowrap>萌え度</th><th>萌えぱ~せんて~じ</th></tr>
EOM

foreach(@sort_rank){
++$rk;
	if($nex_jg == $res_rank{$_}){
		if($next_num){
		$ex_num = $next_num;
		}else{
		$next_num = $rk; $ex_num = --$next_num;
		}
	}else{
	$next_num=0;$ex_num = $rk;
	}

$nex_jg = $rest_rank{$_};
$per = int((($rest_rank{$_}/$all_num)*100)+0.5);
if(!$per){$per=1;}
if($rest_rank{$_}){
$gif_w =int($rest_rank{$_}*$g_width);if(!$gif_w){$gif_w=1;}
print"<tr><td>$ex_num</td><td><b>$_</b></td><td><b>$rest_rank{$_}</b></td><td nowrap><img src=$icon_dir\graph.gif height=\"12\" width=\"$gif_w\"> $per\%</td></tr>";
}
}
print "</table>";
print "<table width=\"80%\"><tr><td>お名前の@、@、☆、★以下は省略されます</td></tr></table>";

$ex_num = $rk = $nex_jg = $next_num = $num = $all_num = 0;

@sort_rank = sort {$mcr_rank{$b} <=> $mcr_rank{$a}} keys(%mcr_rank);
foreach(@sort_rank){if($mcr_rank{$_}){++$num;$all_num = $all_num + $mcr_rank{$_};}}

print <<EOM;
<a name=mcr><br></a>
<table width=\"80%\"><tr><td>
<font color=blue size=+1 face=\"$t_face\">現在の萌えマクロ総数 $all_num だ~び~参加人数 $num人</font><br><br>
<table width="100%"><tr><td><b>※このランキングはマクロ使用ランキングです(w</b></td><td align=right><a href=#all>総合</a> <a href=#cg>画像</a> <a href=#bgm>BGM</a> <a href=#flash>Flash</a> <a href=#res>レス</a> <a href=#rest>編集</a> <a href=#top>TOPに戻る</a></td></tr></table></td></tr></table>
<table width="80%" border=1 cellspacing=0>
<tr><th>順位</th><th>お名前</th><th nowrap>萌え度</th><th>萌えぱ~せんて~じ</th></tr>
EOM

foreach(@sort_rank){
++$rk;
	if($nex_jg == $mcr_rank{$_}){
		if($next_num){
		$ex_num = $next_num;
		}else{
		$next_num = $rk; $ex_num = --$next_num;
		}
	}else{
	$next_num=0;$ex_num = $rk;
	}

$nex_jg = $mcr_rank{$_};
$per = int((($mcr_rank{$_}/$all_num)*100)+0.5);
if(!$per){$per=1;}
if($mcr_rank{$_}){
$gif_w =int($mcr_rank{$_}*$g_width);if(!$gif_w){$gif_w=1;}
print"<tr><td>$ex_num</td><td><b>$_</b></td><td><b>$mcr_rank{$_}</b></td><td nowrap><img src=$icon_dir\graph.gif height=\"12\" width=\"$gif_w\"> $per\%</td></tr>";
}
}
print "</table>";
print "<table width=\"80%\"><tr><td>お名前の@、@、☆、★以下は省略されます</td></tr></table>";
&footer;
exit;
}

解答

こんな感じにしました。 1つのデータから7つのランキングを作って表示しますので、ランキング1つを表示する処理を7回呼び、都度パラメタを変更しています。 順位付けのソートはハッシュリファレンスのキー名なので、それもパラメタで渡してソートさせています。

## ランキング表示
sub rank {
        header($config, bg_img => $bg_img);

        print <<EOF;
<a name=top>[<a href="$config->{script}?cnt=no">掲示板に戻る</a>]</a>
<br>
<center>
<font color="$config->{t_color}" size="6" face="$config->{t_face}">
<b>
<span>貼り逃げだ~び~</span>
</b>
</font>
<br>
<br>
EOF

        my @rank = load_ranking();

        one_ranking(\@rank, @{$_}) for (
                ["count", "", "総合貼り", "all"],
                ["cg_count", "画像", "貼り画像", "cg"],
                ["bgm_count", "BGM", "貼りBGM", "bgm"],
                ["flash_count", "Flash", "貼りFlash", "flash"],
                ["res_count", "レス", "レス", "res"],
                ["rest_count", "編集", "編集", "rest"],
                ["mcr_count", "マクロ", "マクロ使用", "mcr"],
        );

        footer();

        exit;
}

sub one_ranking {
        my ($rank, $sorttype, $totalname, $rankname, $anchor) = @_;
        my @rank = @{$rank};

        my @rank = sort { $b->{$sorttype} <=> $a->{$sorttype} } @rank;
        my $num = @rank;
        my $total_count = 0;
        $total_count += $_->{$sorttype} for @rank;

        print <<EOF;
<a name="$anchor"><br></a>
<table width="80%"><tr><td>
<font color="blue" size="+1" face="$config->{t_face}">現在の萌え${totalname}総数 $total_count だ~び~参加人数 ${num}人</font><br><br>
<table width="100%">
<tr><td><b>※このランキングは${rankname}ランキングです(w</b></td><td align="right"><a href="#cg">画像</a> <a href="#bgm">BGM</a> <a href="#flash">Flash</a> <a href="#res">レス</a> <a href="#rest">編集</a> <a href="#mcr">マクロ</a> <a href="#top">TOPに戻る</a></td></tr>
</table></td></tr>
</table>
<table width="80%" border="1" cellspacing="0">
<tr><th>順位</th><th>お名前</th><th nowrap>萌え度</th><th>萌えぱ~せんて~じ</th></tr>
EOF

        my $rk = 0;
        my $before;
        my $last_rk = -1;
        for (@sort) {
                $rk++;

                my $disp_rank = $before && $before->{$sorttype} == $_->{$sorttype} ? $last_rk : $rk;

                my $ratio = int((($_->{$sorttype} / $total_count) * 100) + 0.5);
                $ratio = 1 if $ratio < 1;

                my $gif_w = int($_->{$sorttype} * $config->{g_width});
                $gif_w = 1 if $gif_w < 1;

                print qq#<tr><td>$disp_rank</td><td><b>$_->{name}</b></td><td><b>$_->{$sorttype}</b></td><td nowrap><img src="$config->{icon_dir}/graph.gif" height="12" width="$gif_w"> $ratio%</td></tr>#;

                $before = $_;
                $last_rk = $disp_rank;
        }

        print qq#</table>#;
        print qq#<table width="80%"><tr><td>お名前の@、@、☆、★以下は省略されます</td></tr></table><br>#;
}