use warnings; use strict; use feature 'say'; my $limit_percent = 0.15; my @nums = ((75) x 5, 99, (75) x 4); # 10 numbers filtered(\@nums); for (qw(75 74 75 90 74 75 7)) { # shift off oldest number, push the next new one shift @nums; push @nums, $_; say "Added: $_"; filtered(\@nums); } sub filtered { my ($nums) = @_; my $sum; $sum += $_ for @$nums; my $avg = $sum / scalar @$nums; my $range_limit = $avg * $limit_percent; my @filtered_nums; for (@nums) { if ($_ > $avg + $range_limit || $_ < $avg - $range_limit) { say "Removing: $_"; next; } push @filtered_nums, $_; } my $filtered_avg; $filtered_avg += $_ for @filtered_nums; return if ! scalar @filtered_nums; $filtered_avg = $filtered_avg / scalar @filtered_nums; printf( "Filtered %.2f, Avg %.2f, Limit: %.2f\n\n", $filtered_avg, $avg, $range_limit ); }