my $n_secs = 30; #seconds after which we die. my $start = time; ## each iteration of this loop is short, but the whole ## thing is long while ( $some_condition ) { die 'We ran too long!' if time-$start >= $n_secs; ## do stuff ## } #### package RunKiller; sub new { my $self = shift; my $obj = { timer => time(), length => shift }; bless $obj, $self; return $self; } sub check { my $self = shift; die 'Ran too long!' if time-($self->{timer}) >= $self->{length}; } 1; #### require RunKiller; my $runtimer = RunKiller->new(30); #30s run length. while (1) { $runtimer->check(); ## do something ## }