5. Example II: statistics

Below an example using two statistical modules.




#!/usr/bin/perl

use Statistics::Lite qw(:all);
use Algorithm::FastPermute ('permute');

sub validate {
	
    $data = shift;
    $data =~ s/\h+/ /g; # replace multiple horizontal space to one single space
    if($data =~ (/^[0-9 ]+$/) and (length($data) > 2) ) { # minimal two integers and a space, i.e. 1 2
      return 1;
    }
    else {
      return 0;
    }
}

$sep = "\n" . ("-" x 65) . "\n";

print($sep);
print("\UStatistics program");
print($sep);

print("Statistical functions:\n0 = count\n1 = frequencies\n2 = range\n3 = sum\n4 = mode\n5 = mean\n6 = median\n7 = variance\n8 = standard deviation\n9 = statsinfo\n10 = permutation");

print($sep);
print("\nEnter more than 2 positive integers, separated by a single space: ");
chomp($numbers = <STDIN>);

if(validate($numbers)) {
	
 print("\nEnter the number of your statistical function: ");
 chomp($stat = <STDIN>);

 print($sep);

 if($stat < 0 or $stat > 10) {
  print("Valid number statistical function required!\nSelect a number between 0 and 10 (inclusive).");
 }
 else
 {
   @data = split(" ", $numbers);
   
   # start 10 statistical functions 
   print("Count: " . count(@data)) if($stat == 0);  

   if($stat == 1) {
     %datas = frequencies(@data);
     print("No" . " " . "Freq" . "\n");
     foreach $k (keys(%datas)) {
       print($k . "  " . $datas{$k} . "\n");
     }
   }
 
   print("Range: " . range(@data)) if($stat == 2); 
   print("Sum: " . sum(@data)) if($stat == 3);  
   print("Mode: " . mode(@data)) if($stat == 4); 
   print("Mean: " . mean(@data)) if($stat == 5);
   print("Median: " . median(@data)) if($stat == 6);	
   print("Variance: " . variance(@data)) if($stat == 7);
   print("Standard deviation: " . stddev(@data)) if($stat == 8);  
   print("Statsinfo:\n" . statsinfo(@data)) if($stat == 9); 
 
   if($stat == 10) {

     sub factorial
     {
       $n = shift;
       $i = 1;
       $result = 1; 
       $result *= ++$i while $i < $n;      
       $result;
     }
  
     $no_elements = @data;
     $f = factorial($no_elements);

     permute {

       (++$count < $f) ? print "@data\n" : print "@data";	 

     } @data;
  
  } 
 
 }

} 
else {

 print("Valid data required!");

}

print($sep . "\n");