use strict; use warnings; no warnings 'uninitialized'; my (%count, %sum, %sum2, %min, %max, @key); while(<>) { my (@val) = split /,/; if ($val[0]=~/^Year/) { @key = @val; } else { @key == @val or die "number of values and keys don't match" for my $i (0..$#key) { my $key = $key[$i]; next if $key =~/Year|Time/; my $val = $val[$i]; $count{$key} ++; $sum{$key} += $val; $sum2{$key} += $val*$val; $min{$key} = $val if (not defined $min{$key} or $val < $min{$key}); $max{$key} = $val if (not defined $max{$key} or $val > $max{$key}); } } } for my $key (sort keys %count) { my $count = $count{$key} my $sum = $sum{$key}; my $mean = $sum/$count; my $deviation = sqrt($sum2{$key}/$count - $mean*$mean); printf("key: %s, mean: %f, deviation: %f, min: %f, max: %f", $key, $mean, $deviation, $min{$key}, $max{$key}); }