Hack #57. Name Your Anonymous Subroutines
Trade a little anonymity for expressivity.
Despite the apparently oxymoronic name, "named anonymous subroutines" are an undocumented feature of Perl. Originally described by "ysth" on Perl Monks, these are a wonderful feature.
Suppose your program merrily runs along with a carefree attitude—but then dies an ugly death:
Denominator must not be zero! at anon_subs.pl line 11
main::__ANON__(0) called at anon_subs.pl line 17What the heck is main::__ANON__(0)? The answer may be somewhere in code such as:
use Carp;
sub divide_by
{
my $numerator = shift;
return sub
{
my $denominator = shift;
croak "Denominator must not be zero!" unless $denominator;
return $numerator / $denominator;
};
}
my $seven_divided_by = divide_by(7);
my $answer = $seven_divided_by->(0);In this toy example, it's easy to see the problem. However, what if you're generating a ton of those divide_by subroutines and sending them all throughout your code? What if you have a bunch of subroutines all generating subroutines (for example, if you've breathed too deeply the heady fumes of Mark Jason Dominus' Higher Order Perl book)? Having a bunch of subroutines named __ANON__ is very difficult to debug.
Tip
$seven_divided_by is effectively a curried version of divide_by( ). That is, it's a function that already has one of multiple arguments bound to it. There's a piece of random functional programming jargon to use to impress people.
The Hack
Creating an anonymous subroutine creates a glob ...