自分で定義するサブルーチンと、始めから備わっている組み込み(?)関数は別物なの?

たとえばハッシュの要素を grep するとき
grep(length($hash{$_}), keys %hash)
とかで、空の要素を含まない配列がつくれるけど

これを自分で定義して
mygrep(length($hash{$_}), keys %hash)
sub mygrep { ... }
って出来る?

要は 上の grep の引数内の$_の動きが疑問なんだけど