機能追加。
#!/bin/perl -w
# 残り試合の勝率計算、現状の勝率・ゲーム差計算

use Getopt::Long;

use Data::Dumper;

$blanks = 0;
GetOptions('i' => \$interleague, # 交流戦
	   'd' => \$no_draw,	 # 引き分けを含めない
	   's' => \$not_sort,	 # 勝率で並べ替えない
	   'f' => \$future,	 # 残試合の勝率の表示
	   'c' => \$color,	 # 色付け
	   'g' => \$gb,		 # ゲーム差表示 games behind
	   'a' => \$all,	 # 全試合数表示
	   'o' => \$order,	 # 勝率順にゲーム差表示
	   'ol' => \$lines,	 # ゲーム差を広げて表示
	   '--b=i' => \$blanks	 # 最後に表示する空行数
);

$order = 1 if ($lines);

# 勝率の1の位の0を削る
sub dotave
{
    $avestr = sprintf("%.4f", $_[0]);
    $avestr =~ s/0\././; 
    $avestr =~ s/1\.0000/1.000/; # 100%の場合は桁を変更
    return $avestr;
}

# 空行を表示
sub blanks
{
    for ($i = 0; $i < $blanks; $i++) {
	print "\n";
    }
    exit 0;
}

# 色の設定
if ($color) {
    %bg = (
	"H" => "3",
	"B" => "4",
	"F" => "6",
	"E" => "1",
	"L" => "4",
	"M" => "7",

	"G" => "7",
	"T" => "3",
	"C" => "1",
	"S" => "7",
	"D" => "6",
	"BS" => "4",
    );
    %fg = (
	"H" => "3;1",
	"B" => "7;1",
	"F" => "0",
	"E" => "7",
	"L" => "7",
	"M" => "0",

	"G" => "0",
	"T" => "0;1",
	"C" => "7;1",
	"S" => "0;1",
	"D" => "6;1",
	"BS" => "6;1",
    );
}

open(DATAFILE, "< $ARGV[0]") or die("指定ファイルエラー\n");

if ($interleague) {
    $games = 24;		# 交流戦試合数
}
else {
    $games = 144;		# リーグ戦試合数
}

while ($line = ) {	# 読み込み
    chomp($line);		# 行末の改行を削る
    next if ($line =~ /^\s*$/);	# 空行は無視

    # 要素で分割
    ($team, $win, $loss, $draw) = split(/\t/, $line);

    if ($order) {		# ゲーム差表用の数値をまとめる
	$elems_cur = {		# 現時点の値
	    team => $team,	# チーム名
	    win => $win,	# 勝ち
	    loss => $loss,	# 負け
	    draw => $draw,	# 引き分け
	    ave => $win / ($win + $loss), # 勝率
	};
	push(@cur, $elems_cur);
    }
    else {	# 以降の勝率計算
	$left = $games - $win - $loss - $draw; # 残り試合
	for ($w = $left; $w >= 0; $w--) {      # 勝ち数
	    for ($l = 0; $l <= $left - $w; $l++) { # 負け数
		$l = $left - $w if ($no_draw); # 引き分け数を加味しない
		$d = $left - $w - $l;	   # 引き分け数

		# 計算結果の要素をまとめる
		$elems = {
		    team => $team, # チーム名
		    win => $w,	   # 今後の勝ち
		    loss => $l,	   # 今後の負け
		    draw => $d,	   # 今後の引き分け
		    win_all => $win + $w,   # 通算の勝ち
		    loss_all => $loss + $l, # 通算の負け
		    draw_all => $draw + $d, # 通算の引き分け
		    ave => ($win + $w) / ($win + $w + $loss + $l), # 今後の勝率
		};
		push(@elem_set, $elems);
	    }
	}
    }
}

if ($order) {	# 現状の順位表の表示
    @cur = sort {$b->{ave} <=> $a->{ave}} @cur; # 勝率で並べ替え
    $zero = $cur[0]{win} - $cur[0]{loss}; # 首位チームの貯金

    $prev = $zero;		# 直近上位チームの貯金
    print "チ  勝  負 分 勝率   差   差  貯金 残\n";
    foreach $e (@cur) {
	$behind = ($prev - @$e{win} + @$e{loss}) / 2; # 直近とのゲーム差
	$prev = @$e{win} - @$e{loss};

	if ($lines) {		# ゲーム差分行を開けて表示
	    $diff = $behind / 0.5 - 1;
	    for ($i = 0; $i < $diff; $i++) {
		for ($j = 0; $j < 18; $j++) {
		    print " |";
		}
		print "\n";
	    }
	}
	# 色付き
	printf("\e[4%s;3%sm", $bg{@$e{team}}, $fg{@$e{team}}) if ($color);

	printf("%-2s %3d %3d %2d", @$e{team}, @$e{win}, @$e{loss}, @$e{draw});
	printf(" %s", &dotave(@$e{ave}));
	printf(" %4.1f", ($zero - $prev) / 2); # 首位との差
	printf(" %4.1f", $behind);	       # 直近との差
	printf(" %3d", $prev);		       # 貯金
	printf(" %3d", $games - @$e{win} - @$e{loss} - @$e{draw}); # 残り試合

	print "\e[m" if ($color); # 色消し
	print "\n";

    }
    &blanks;	# ゲーム差表を表示したら終了
}

unless ($not_sort) {		# 勝率で降順並べ替え
    @elem_set = sort {$b->{ave} <=> $a->{ave}} @elem_set;

    # 並べ替えた場合はヘッダ表示
    print "チ   勝 - 負";
    print "  分" unless ($no_draw);
    print "  勝 - 負  分" if ($all);
    print "  勝率";
    print "  残勝率" if ($future);
    print "  差" if ($gb);
    print "\n";
}
else {
    $gb = 0;		# 並べ替えをしない時にはゲーム差を非表示
}

# 首位チームの貯金
$zero = $elem_set[0]->{win_all} - $elem_set[0]->{loss_all} if ($gb);

# 結果表示
foreach $e (@elem_set) {
    printf("\e[4%s;3%sm", $bg{@$e{team}}, $fg{@$e{team}}) if ($color); # 色付き

    printf("%-2s", @$e{team});
    if (@$e{win_all} - @$e{win} +
	@$e{loss_all} - @$e{loss} +
	@$e{draw_all} - @$e{draw} == $games) { # 全試合終了
	print "*";	   # 戦績が確定したチームには"*"を付ける
    }
    else {
	print " ";
    }
    printf("  %2d - %2d", @$e{win}, @$e{loss});
    printf("  %2d", @$e{draw}) unless ($no_draw); # 引き分けを加味しない
    if ($all) {	# 全試合の戦績も表示
	printf("  %2d - %2d", @$e{win_all}, @$e{loss_all});
	unless ($no_draw) {
	    printf("  %2d", @$e{draw_all}); # 引き分けを加味しない
	}
	else {
	    printf("  %2d", @$e{draw_all} - @$e{draw}); # 現状の引き分けを表示
	}
    }
    printf("  %s", &dotave(@$e{ave}));

    if ($future) {	# 残試合での勝率
	if (@$e{win} + @$e{loss} == 0) { # 0除算回避
	    print "  .0000";
	}
	else {
	    printf("  %s", &dotave(@$e{win} / (@$e{win} + @$e{loss})));
	}
    }

    printf(" %4.1f", ($zero - @$e{win_all} + @$e{loss_all}) / 2) if ($gb);
    print "\e[m" if ($color);	# 色消し
    print "\n";
}

&blanks;	# 空行表示