次のようなものでうまくいくはずです。
use constant DB_CHECK_PERIOD => 5*60;
sub handle_db_events {
my ($w) = @_;
while (1) {
my $secs = ...get seconds to earliest unprocessed event from the db...;
$secs //= DB_CHECK_PERIOD;
if ($secs > 0) {
$w->set($secs > DB_CHECK_PERIOD ? DB_CHECK_PERIOD : $secs, 0);
return;
}
... process events that have expired and delete them from the db ...;
}
}
my $w = EV::timer(DB_CHECK_PERIOD, 0, \&handle_db_events);
handle_db_events($w);
DBからレコードを削除できない場合は、レコードに処理済みであることを示すフラグを設定するか、レコードIDでインデックス付けされたハッシュを使用できます。
$w
最初の引数としてコールバックに渡されると仮定しています。そうでない場合は調整します。