処理自体には困ってないが、すっきりしなくて先に進めない。

@::event = (
[sub{真偽判定文}, sub{実行したい処理}],
[sub{真偽判定文}, sub{実行したい処理}],
);
みたいな感じになってる。
実際の代入は $::event[\d+] = [sub{真偽判定文}, sub{実行したい処理}];
の形式で行うため、順番が飛ばされて未定義値の場合もある。
(例えば$::event[6]が存在するが$::event[5]が存在しない場合も起こりうる)。
また、実行順が変わると困るものがあるので@::eventはハッシュにはできない。

# $_[1]()を先頭に書けるケース。条件判定がひたすらうざい。
$_->[1]() foreach (grep { $_ and $_->[0]() } @::event);

# ifが修飾子に使えるがブロックになってるのであんま意味ない。
foreach (@::event){ $_->[1]() if( $_ and $_->[0]() ) }

# grepを使ったケース。利点はない気がする。
grep { $_ and $_->[0]() and $_->[1] } @::event;

# foreachを修飾子に使えるケース。$_[1]() が先頭にこない。
$_ and $_->[0]() and $_->[1]() foreach (@::event);

# もし書けるならこれが一番見やすいのに。
$_->[1]() if( $_ and $_->[0]() ) foreach (@::event);

いい呼び出し方教えてください。
これがいいって確信を得られなくて、気持ち悪くて進めん。
なお、@::eventの構造を変えるのは、すごくいいのがあれば可。
ちょっといいだけなら書きなおさない。