--- trunk/sum.pl 2008/04/08 20:46:20 75 +++ trunk/sum.pl 2008/04/08 21:05:42 76 @@ -2,6 +2,12 @@ use strict; use Term::ReadKey qw(GetTerminalSize); +use Getopt::Long; + +my $human = 0; +GetOptions( + 'human!' => \$human, +); my @lines; @@ -10,6 +16,28 @@ my $rest_len = 0; my $sum = 0; +my @units = qw/b k M G/; +sub unit { + my $v = shift; + + return $v unless $human; + + my $o = 0; + + while ( ( $v / 10000 ) >= 1 ) { + $o++; + $v /= 1024; + } + + if ( $v >= 1 ) { + return sprintf("%d%s", $v, $units[$o]); + } elsif ( $v == 0 ) { + return 0; + } else { + return sprintf("%.1f%s", $v, $units[$o]); + } +} + while(<>) { chomp; if (/\s*([\d\.]+)\s+(.+)/) { @@ -60,6 +88,6 @@ foreach my $l (@lines) { my ($size,$r,$tmpsum) = @{$l}; # printf "%-50s\t[ + %-8d= %-8d ]\n",$r,$size,$tmpsum; - printf "%-${rest_len}s %${size_len}d %-${bar_size}s %${sum_len}d\n", - $r, $size, bar($size, $sum, $tmpsum, $sum), $tmpsum; + printf "%-${rest_len}s %${size_len}s %-${bar_size}s %${sum_len}s\n", + $r, unit($size), bar($size, $sum, $tmpsum, $sum), unit($tmpsum); }