use strict; use warnings; my $expiry = time + 3600; my $time; my $previoustime; sub mysleep { printf 'before sleeping: time = %d, $time = %d, %s', time, $time, "\n"; sleep shift; printf 'after sleeping: time = %d, $time = %d, %s', time, $time, "\n"; } while ( $time = time and $time + 300 < $expiry and ( $time - $previoustime >= 10 or mysleep (10 + $previoustime - $time) ) ) { $previoustime = $time; warn $time; }