Perlで2つの配列の両方に含まれる要素を、foreachを使わずに抜き出す方法は?

id:smoking186さんの同村指数計測の過程で触れられてた問題。ちょっと考えてみたんですけど、いい方法が思いつきません。うむむむむ……。

@a = (1,2,3,4,5);
@b = (1,3,5);

# 配列をハッシュのキーに変換
%a = map { $_ => 1 } @a;
%b = map { $_ => 1 } @b;

# %aのキーのうち%bのキーに含まれる要素を取得する
@c = grep {exists $b{$_}} keys(%a);

もし配列の要素がユニークだとしたら、最初からハッシュにしておけばforeachより速くなるかも。