Это не совсем ответ на твой вопрос, но может поможет:
$SIG{ALRM}=sub {die "timeout"};
eval
{ alarm(300);
# делаешь что-нибудь
alarm(0);
}
if ($@)
{ if ($@=~/timeout/)
{ # произошёл тайм-аут
}
else
{ die; # произошло какое-то другое исключение,
# но не тайм-аут. Передать дальше.
}
}