Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I have a script that checks how many lines are added per second, and the total number of lines. I want to be able to have the data of $line_count , be stored temporary every 10 changes or intervals, then have all the numbers averaged.. i myself have NO clue how to do this.. any math wiz's out there help me out.. the code is below.
#!/bin/perl use Term::ANSIColor; use Term::ANSIColor 2.00 qw(:pushpop); use File::Tail; my $file=File::Tail->new("output.txt"); my $last_time = time(); my $line_count = 0; while (defined($line=$file->read )){ if ( time() > $last_time ){ $last_time = time(); open(FILE, "output.txt"); @lines = <FILE>; close(FILE); $num = @lines; system 'clear'; print colored("Bots p/s: $line_count\n", "green"); print colored("Total Bots: $num\n", "green"); print " \n \n \n"; print color 'reset'; $line_count = 0; } $line_count++; }

Replies are listed 'Best First'.
Re: Reading the average of a changing varible
by hdb (Monsignor) on Feb 23, 2014 at 09:17 UTC

    One could use a buffer of the desired size of data, and then store the data to be averaged cycling through the buffer. As I cannot replicate your data, I am using random numbers to demonstrate the principle:

    use strict; use warnings; # initialize averaging use List::Util 'sum'; my $size = 10; my @store; my $i = -1; while (1){ my $line_count = int rand 100; # store data and output average $store[ ($i+=1) %= $size ] = $line_count; my $average = sum( grep defined, @store )/$size; print "Average line count: $average\n"; }

    This way, one would always print the average of the last $size numbers generated. It requires a run up period, so one cannot trust the first $size averages, which I would guess, should not be an issue if you want to run it for a long time.