use strict; my @avg; my $avgv; my $n; my $N = 30; my $wait; open F,"./AMSTracker -s -u0.01 |"; while() { my @a = /(-?\d+)/g; print, next if @a != 3; $wait = $wait + 1; # compute running average $n = ($n == $N-1) ? 0 : $n+1; $avgv = $avgv + ($a[0]-$avg[$n])/$N; $avg[$n] = $a[0]; # if unexpected values? if(abs($a[0]-$avgv) > 30 && $wait > $N) { my $foo = $a[1] < 0 ? 'Prev' : 'Next'; system "./notify SwitchTo${foo}Workspace\n"; } # if there is too much movement, switch off detection if (abs($a[0]-$avgv) > 10) { $wait = 0; } }