Thanks for the feedback. I left out the my and the use (warnings && strict) while pasting. My bad.
The reason I have the wantarray is because I wanted to be able to ignore the index with out forcing list context.
Your right about the local $_ (Lava flow from first try). I lost it all together as $_ is localized by for anyway.
Could you elaborate on what you had in mind for an end hook?
What I think is interesting about this (for me anyway) is being able to retain state without resorting to objects. Using an %args hash for a function and this technique, it should be pretty easy to write iterator functions without OO. Nothing wrong with objects but for something like this, the grep syntax feels more natural and looks better to me.
I don't know if there is anything on CPAN for this. The closest I found was first() in List::Util
It was mainly an "I should be able to do that.." exercise.
"To be civilized is to deny one's nature."