条件式AがあってそのAは%hashのキーをいくつか返してきます。
foreach (grep /\-/,keys %hash){
delete $hash{$_};
}

でも条件Aが返してくるリストの数が3以上のときだけ、それ以降を全てdeleteしたいのです。
my $i =0;
foreach (grep /\-/,keys %hash){
delete $hash{$_} if $i > 1;
$i++;
}

これでできます。しかし$iとか作るのダサイので嫌です。
mapやgrepで$iを作らずにリストの?個以降には特別な処理をするということはできませんか?