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 ); } #### Removing: 99 Filtered 75.00, Avg 77.40, Limit: 11.61 Added: 75 Removing: 99 Filtered 75.00, Avg 77.40, Limit: 11.61 Added: 74 Removing: 99 Filtered 74.89, Avg 77.30, Limit: 11.59 Added: 75 Removing: 99 Filtered 74.89, Avg 77.30, Limit: 11.59 Added: 90 Removing: 99 Filtered 76.56, Avg 78.80, Limit: 11.82 Added: 74 Removing: 99 Filtered 76.44, Avg 78.70, Limit: 11.80 Added: 75 Removing: 90 Filtered 74.78, Avg 76.30, Limit: 11.44 Added: 7 Removing: 90 Removing: 7 Filtered 74.75, Avg 69.50, Limit: 10.42