App-summ

 view release on metacpan or  search on metacpan

script/summ  view on Meta::CPAN

#!perl

our $DATE = '2018-07-07'; # DATE
our $VERSION = '0.001'; # VERSION

use strict;
use warnings;

use Getopt::Long qw(:config bundling no_ignore_case);

my %Opts = (
    calc_count    => 1,
    calc_mode     => 1,
    calc_min      => 1,
    calc_max      => 1,
    calc_mean     => 1,
    calc_median   => 1,
    calc_variance => 1,
    calc_stddev   => 1,
    calc_percentiles => [25, 75],
    calc_covariance => 0,
    calc_correlation => 0,
);

sub parse_cmdline {
    my $res = GetOptions(
        'count!'    => \$Opts{calc_count},
        'mode!'     => \$Opts{calc_mode},
        'max!'      => \$Opts{calc_max},
        'min!'      => \$Opts{calc_min},
        'mean!'     => \$Opts{calc_mean},
        'median!'   => \$Opts{calc_median},
        'variance!' => \$Opts{calc_variance},
        'stddev!'   => \$Opts{calc_stddev},
        'no-percentile|P' => sub { $Opts{calc_percentiles} = [] },
        'percentile|p=s'  => sub {
            my $p = int($_[1]);
            die "summ: Invalid percentile $p, must be between 0 and 100\n"
                if $p < 0 || $p > 100;
            push @{ $Opts{calc_percentiles} }, $p
                unless grep { $p == $_ } @{ $Opts{calc_percentiles} };
        },
        'covariance!'  => \$Opts{calc_covariance},
        'correlation!' => \$Opts{calc_correlation},
        'help|h' => sub {
            print <<USAGE;
Usage:
  summ [OPTIONS]... [INPUT]...
  summ --help

For more details, see the manpage/documentation.
USAGE
            exit 0;
        },
        'version|v' => sub {
            no warnings 'once';
            print "summ version ".($main::VERSION // 'dev'), "\n";
            exit 0;
        },
    );
    exit 99 if !$res;
}

sub run {
    my (@nums, @nums2);
    while (<>) {
        chomp;
        if ($Opts{calc_covariance} || $Opts{calc_correlation}) {
            my ($n, $n2) = split /\s+/, $_, 2;
            defined $n2 or die "summ:$.: Please supply two numbers: $_\n";
            push @nums, $n+0;
            push @nums2, $n2+0;
        } else {
            push @nums, $_+0;
        }
    }
    die "summ: Please specify at least 1 number\n" unless @nums;

    require Statistics::Discrete;
    my $sd = Statistics::Discrete->new;
    $sd->add_data(@nums);

    if ($Opts{calc_count}) {
        printf "Count: %s\n", $sd->count;
    }
    if ($Opts{calc_mode}) {
        require Statistics::Basic;
        require Statistics::Basic::Mode;
        printf "Mode: %s\n", Statistics::Basic::mode(@nums);
    }
    if ($Opts{calc_min}) {
        printf "Minimum: %s\n", $sd->minimum;
    }
    if ($Opts{calc_max}) {
        printf "Maximum: %s\n", $sd->maximum;
    }
    if ($Opts{calc_mean}) {
        printf "Mean: %s\n", $sd->mean;
    }
    if ($Opts{calc_median}) {
        printf "Median: %s\n", $sd->median;
    }
    if ($Opts{calc_variance}) {
        printf "Variance: %s\n", $sd->variance;
    }
    if ($Opts{calc_stddev}) {
        printf "Std. dev.: %s\n", $sd->standard_deviation;
    }



( run in 1.008 second using v1.01-cache-2.11-cpan-f56aa216473 )