#!perl
our
$DATE
=
'2018-07-07'
;
our
$VERSION
=
'0.001'
;
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
;
my
$sd
= Statistics::Discrete->new;
$sd
->add_data(
@nums
);
if
(
$Opts
{calc_count}) {
printf
"Count: %s\n"
,
$sd
->count;
}
if
(
$Opts
{calc_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;
}
if
(@{
$Opts
{calc_percentiles} }) {
for
my
$p
(
sort
{
$a
<=>
$b
} @{
$Opts
{calc_percentiles} }) {
printf
"%s percentile: %s\n"
,
Lingua::EN::Numbers::Ordinate::ordinate(
$p
),
$sd
->percentile(
$p
);
}
}
if
(
$Opts
{calc_covariance}) {
printf
"Covariance: %s\n"
, Statistics::Basic::covariance(
\
@nums
, \
@nums2
);
}
if
(
$Opts
{calc_correlation}) {
printf
"Correlation: %s\n"
, Statistics::Basic::correlation(
\
@nums
, \
@nums2
) + 0;
}
}
parse_cmdline();
run();
1;