Starting with Perl 5.10, it is possible to create a lexical version of the Perl
default variable $_. Certain Perl constructs like the given keyword
automatically use a lexical $_ rather than the global $_.
It is occasionallly useful for a sub to be able to access its callers
$_ variable regardless of whether it was lexical or not. The (_)
sub prototype is the official way to do so, however there are sometimes
disadvantages to this; in particular it can only appear as the final required
argument in a prototype, and there is no way of the sub differentiating between
an explicitly passed argument and $_.
This caused me problems with Scalar::Does, because I wanted to enable the
does function to be called as either:
does($role); # assumes $thing = $_
With _ in the prototype, $_ was passed to the function at the end
of its argument list; effectively does($role, $thing), making it
impossible to tell which argument was the role.
Enter lexical::underscore which allows you to access your callers lexical
$_ variable as easily as:
You can access lexical $_ further up the call stack using:
If you happen to ask for $_ at a level where no lexical $_ is
available, you get the global $_ instead.
This module does work on Perl 5.8 but as there is no lexical $_, always
returns the global $_.