How about sleeping until the next polling interval (based on when you started looping) instead of a hardcoded delay? This will account for however long your processing takes (even if the amount of time it takes to process changes). It can be "off" by a fraction of a second, but should correct itself so the drift does not accumulate.
my $t0=time();
while(1){
# do processing
# ..
# sleep till next polling interval.
sleep 60-(time()-$t0)%60;
}
Use this concept with
Time::HiRes for greater accuracy.