#!/usr/bin/perl

sub covariance {
    my ($array1ref, $array2ref) = @_;
    my ($i, $result);
    for ($i = 0; $i < @$array1ref; $i++) {
        $result += $array1ref->[$i] * $array2ref->[$i];
    }
    $result /= @$array1ref;
    $result -= mean($array1ref) * mean($array2ref);
}

sub correlation {
    my ($array1ref, $array2ref) = @_;
    my ($sum1, $sum2);
    my ($sum1_squared, $sum2_squared);
    foreach (@$array1ref) { $sum1 += $_; $sum1_squared += $_ ** 2 }
    foreach (@$array2ref) { $sum2 += $_; $sum2_squared += $_ ** 2 }
    return (@$array1ref ** 2) * covariance($array1ref, $array2ref) /
        sqrt(((@$array1ref * $sum1_squared) - ($sum1 ** 2)) *
             ((@$array1ref * $sum2_squared) - ($sum2 ** 2)));
}

@hits  = (2378, 4024, 9696, 7314, 7710);
@sales = (310.94, 315.88, 514.15, 500.18, 610.37);

print correlation(\@hits, \@sales), "\n";

# $mean = mean(\@array) computes the mean of an array of numbers.
#
sub mean {
    my ($arrayref) = @_;
    my $result;
    foreach (@$arrayref) { $result += $_ }
    return $result / @$arrayref;
}
