http://www.perlmonks.org?node_id=177943


in reply to How do I write subs that take bare blocks as args?

Use a prototype. Here is an example from Graham Barr's List::Util:
sub first (&@) { my $code = shift; foreach (@_) { return $_ if &{$code}(); } undef; }
which is invoked as
# first defined value in @list $foo = first { defined($_) } @list;
-Mark