PV計算機 by perl

PVとトラフィックの計算で欲しくなった。

[calcpv]

#!/usr/bin/perl
use strict;
use warnings;
#use bigint;
use Data::Table;

=pod

    PV calculator

    $ calcpv 4500pv/min 100

=cut

my @UNIT_LIST = qw/sec min hour day week month year/;
my $REGEX = join '|', @UNIT_LIST;

my $input = shift;
unless ($input) {
    _usage();
    exit;
}

my $size = shift || 0;

my ($pv, $unit, $value);
if ( $input =~ m!(\d+).+/($REGEX)! ) {
    ($pv, $unit) = ($1, $2);
}
else {
    _usage();
    exit;
}

my $data;
for my $u (@UNIT_LIST) {
    if ($u eq $unit) {
        $value = $pv;
    }
    else {
        my $func = \&{$unit."2$u"};
        $value = $func->($pv);
    }
    my $traffic = $value * $size;
    push @{$data}, [$u, _opti($value), _opti($traffic)];
}

my $t = Data::Table->new( $data, ['unit', 'pv', 'traffic(KB)'], 0, );
print $t->tsv;


sub _opti {
    my $num = shift;
    my ($value) = ( $num =~ m!^(\d+\.?\d?\d?)! );
    while($value =~ s/(.*\d)(\d\d\d)/$1,$2/){};
    return $value;
}

sub _usage {
    print "Usage: $0 NUMBERpv/[$REGEX] size(KB)\n";
    print "ex: $0 4500pv/min 80\n";
}



sub sec2min {
    return $_[0] * 60;
}
sub sec2hour {
    return $_[0] * 60 * 60;
}
sub sec2day {
    return $_[0] * 60 * 60 * 24;
}
sub sec2week {
    return $_[0] * 60 * 60 * 24 * 7;
}
sub sec2month {
    return $_[0] * 60 * 60 * 24 * 7 * 30;
}
sub sec2year {
    return $_[0] * 60 * 60 * 24 * 7 * 365;
}



sub min2sec {
    return $_[0] / 60;
}
sub min2hour {
    return $_[0] * 60;
}
sub min2day {
    return $_[0] * 60 * 24;
}
sub min2week {
    return $_[0] * 60 * 24 * 7;
}
sub min2month {
    return $_[0] * 60 * 24 * 30;
}
sub min2year {
    return $_[0] * 60 * 24 * 365;
}



sub hour2sec {
    return $_[0] / 60 / 60;
}
sub hour2min {
    return $_[0] / 60;
}
sub hour2day {
    return $_[0] * 24;
}
sub hour2week {
    return $_[0] * 24 * 7;
}
sub hour2month {
    return $_[0] * 24 * 30;
}
sub hour2year {
    return $_[0] * 24 * 365;
}



sub day2sec {
    return $_[0] / 24 / 60 / 60;
}
sub day2min {
    return $_[0] / 24 / 60;
}
sub day2hour {
    return $_[0] / 24;
}
sub day2week {
    return $_[0] * 7;
}
sub day2month {
    return $_[0] * 30;
}
sub day2year {
    return $_[0] * 365;
}



sub week2sec {
    return $_[0] / 7 / 24 / 60 / 60;
}
sub week2min {
    return $_[0] / 7 / 24 / 60;
}
sub week2hour {
    return $_[0] / 7 / 24;
}
sub week2day {
    return $_[0] / 7;
}
sub week2month {
    return day2month( week2day($_[0]) );
}
sub week2year {
    return day2year( week2day($_[0]) );
}



sub month2sec {
    return $_[0] / 30 / 24 / 60 / 60;
}
sub month2min {
    return $_[0] / 30 / 24 / 60;
}
sub month2hour {
    return $_[0] / 30 / 24;
}
sub month2day {
    return $_[0] / 30;
}
sub month2week {
    return day2week( month2day($_[0]) );
}
sub month2year {
    return $_[0] * 12;
}



sub year2sec {
    return $_[0] / 365 / 24 / 60 / 60;
}
sub year2min {
    return $_[0] / 365 / 24 / 60;
}
sub year2hour {
    return $_[0] / 365 / 24;
}
sub year2day {
    return $_[0] / 365;
}
sub year2week {
    return day2week( year2day($_[0]) );
}
sub year2month {
    return $_[0] / 12;
}


* 未全テスト。