|
NAMElexical::underscore - access your caller's lexical underscoreSYNOPSISuse 5.010; use lexical::underscore; use Test::More; sub is_uppercase { my $var = @_ ? shift : ${lexical::underscore()}; return $var eq uc($var); } my $thing = 'FOO'; my $works = 0; given ( $thing ) { when ( is_uppercase ) { $works++ } } ok($works); done_testing(); DESCRIPTIONStarting 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 caller's $_ 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($thing, $role); 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 caller's lexical $_ variable as easily as: ${lexical::underscore()} You can access lexical $_ further up the call stack using: ${lexical::underscore($level)} 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 $_. Technical DetailsThe "lexical::underscore" function returns a scalar reference to either a lexical $_ variable somewhere up the call stack (using PadWalker magic), or to the global $_ if there was no lexical version.Wrapping "lexical::underscore" in "${ ... }" dereferences the scalar reference, allowing you to access (and even assign to) it. BUGSPlease report any bugs to <http://rt.cpan.org/Dist/Display.html?Queue=lexical-underscore>.SEE ALSOPadWalker.AUTHORToby Inkster <tobyink@cpan.org>.COPYRIGHT AND LICENCEThis software is copyright (c) 2012, 2014 by Toby Inkster.This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. DISCLAIMER OF WARRANTIESTHIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
Visit the GSP FreeBSD Man Page Interface. |