constant::lexical - Perl pragma to declare lexical compile-time constants
2
use constant::lexical DEBUG => 0; { use constant::lexical PI => 4 * atan2 1, 1; use constant::lexical DEBUG => 1; print "Pi equals ", PI, "...\n" if DEBUG; } print "just testing...\n" if DEBUG; # prints nothing (DEBUG is 0 again) use constant::lexical \%hash_of_constants; use constant::lexical WEEKDAYS => @weekdays; # list use constant::lexical { PIE => 4 * atan2(1,1), CHEESECAKE => 3 * atan2(1,1), };
This module creates compile-time constants in the manner of constant.pm, but makes them local to the enclosing scope.
I sometimes use these for objects that are blessed arrays, which are faster than hashes. I use constants instead of keys, but I don't want them exposed as methods, so this is where lexical constants come in handy.
This module requires perl 5.8.0 or later and, depending on your version of perl, one of the following modules, which you can get from the CPAN:
For perl 5.11.2 and higher: Lexical::Sub
For lower perl versions: Sub::Delete
The following three bugs have been fixed for perl 5.11.2 and higher, but are still present for older versions of perl:
These constants are no longer available at run time, so they won't work in a string eval (unless, of course, the use statement itself is inside the eval).
eval
use
These constants actually are accessible to other scopes during compile-time, as in the following example:
sub foo { print "Debugging is on\n" if &{'DEBUG'} } { use constant::lexical DEBUG => 1; BEGIN { foo } }
If you switch to another package within a constant's scope, it (the constant) will apparently disappear.
If you find any other bugs, please report them to the author via e-mail.
The idea of using objects in %^H (in the pre-5.11.2 code) was stolen from namespace::clean.
%^H
Some of the code for the perl 5.11.2 version is plagiarised from constant.pm by Tom Phoenix.
Copyright (C) Father Chrysostomos (sprout at, um, cpan dot org)
This program is free software; you may redistribute or modify it (or both) under the same terms as perl.
constant, Sub::Delete, namespace::clean, Lexical::Sub
1 POD Error
The following errors were encountered while parsing the POD:
Non-ASCII character seen before =encoding in '‘package’'. Assuming UTF-8
To install constant::lexical, copy and paste the appropriate command in to your terminal.
cpanm
cpanm constant::lexical
CPAN shell
perl -MCPAN -e shell install constant::lexical
For more information on module installation, please visit the detailed CPAN module installation guide.