1package constant; 2use 5.008; 3use strict; 4use warnings::register; 5 6use vars qw($VERSION %declared); 7$VERSION = '1.31'; 8 9#======================================================================= 10 11# Some names are evil choices. 12my %keywords = map +($_, 1), qw{ BEGIN INIT CHECK END DESTROY AUTOLOAD }; 13$keywords{UNITCHECK}++ if $] > 5.009; 14 15my %forced_into_main = map +($_, 1), 16 qw{ STDIN STDOUT STDERR ARGV ARGVOUT ENV INC SIG }; 17 18my %forbidden = (%keywords, %forced_into_main); 19 20my $normal_constant_name = qr/^_?[^\W_0-9]\w*\z/; 21my $tolerable = qr/^[A-Za-z_]\w*\z/; 22my $boolean = qr/^[01]?\z/; 23 24BEGIN { 25 # We'd like to do use constant _CAN_PCS => $] > 5.009002 26 # but that's a bit tricky before we load the constant module :-) 27 # By doing this, we save 1 run time check for *every* call to import. 28 my $const = $] > 5.009002; 29 my $downgrade = $] < 5.015004; # && $] >= 5.008 30 my $constarray = exists &_make_const; 31 if ($const) { 32 Internals::SvREADONLY($const, 1); 33 Internals::SvREADONLY($downgrade, 1); 34 $constant::{_CAN_PCS} = \$const; 35 $constant::{_DOWNGRADE} = \$downgrade; 36 $constant::{_CAN_PCS_FOR_ARRAY} = \$constarray; 37 } 38 else { 39 no strict 'refs'; 40 *{"_CAN_PCS"} = sub () {$const}; 41 *{"_DOWNGRADE"} = sub () { $downgrade }; 42 *{"_CAN_PCS_FOR_ARRAY"} = sub () { $constarray }; 43 } 44} 45 46#======================================================================= 47# import() - import symbols into user's namespace 48# 49# What we actually do is define a function in the caller's namespace 50# which returns the value. The function we create will normally 51# be inlined as a constant, thereby avoiding further sub calling 52# overhead. 53#======================================================================= 54sub import { 55 my $class = shift; 56 return unless @_; # Ignore 'use constant;' 57 my $constants; 58 my $multiple = ref $_[0]; 59 my $pkg = caller; 60 my $flush_mro; 61 my $symtab; 62 63 if (_CAN_PCS) { 64 no strict 'refs'; 65 $symtab = \%{$pkg . '::'}; 66 }; 67 68 if ( $multiple ) { 69 if (ref $_[0] ne 'HASH') { 70 require Carp; 71 Carp::croak("Invalid reference type '".ref(shift)."' not 'HASH'"); 72 } 73 $constants = shift; 74 } else { 75 unless (defined $_[0]) { 76 require Carp; 77 Carp::croak("Can't use undef as constant name"); 78 } 79 $constants->{+shift} = undef; 80 } 81 82 foreach my $name ( keys %$constants ) { 83 # Normal constant name 84 if ($name =~ $normal_constant_name and !$forbidden{$name}) { 85 # Everything is okay 86 87 # Name forced into main, but we're not in main. Fatal. 88 } elsif ($forced_into_main{$name} and $pkg ne 'main') { 89 require Carp; 90 Carp::croak("Constant name '$name' is forced into main::"); 91 92 # Starts with double underscore. Fatal. 93 } elsif ($name =~ /^__/) { 94 require Carp; 95 Carp::croak("Constant name '$name' begins with '__'"); 96 97 # Maybe the name is tolerable 98 } elsif ($name =~ $tolerable) { 99 # Then we'll warn only if you've asked for warnings 100 if (warnings::enabled()) { 101 if ($keywords{$name}) { 102 warnings::warn("Constant name '$name' is a Perl keyword"); 103 } elsif ($forced_into_main{$name}) { 104 warnings::warn("Constant name '$name' is " . 105 "forced into package main::"); 106 } 107 } 108 109 # Looks like a boolean 110 # use constant FRED == fred; 111 } elsif ($name =~ $boolean) { 112 require Carp; 113 if (@_) { 114 Carp::croak("Constant name '$name' is invalid"); 115 } else { 116 Carp::croak("Constant name looks like boolean value"); 117 } 118 119 } else { 120 # Must have bad characters 121 require Carp; 122 Carp::croak("Constant name '$name' has invalid characters"); 123 } 124 125 { 126 no strict 'refs'; 127 my $full_name = "${pkg}::$name"; 128 $declared{$full_name}++; 129 if ($multiple || @_ == 1) { 130 my $scalar = $multiple ? $constants->{$name} : $_[0]; 131 132 if (_DOWNGRADE) { # for 5.8 to 5.14 133 # Work around perl bug #31991: Sub names (actually glob 134 # names in general) ignore the UTF8 flag. So we have to 135 # turn it off to get the "right" symbol table entry. 136 utf8::is_utf8 $name and utf8::encode $name; 137 } 138 139 # The constant serves to optimise this entire block out on 140 # 5.8 and earlier. 141 if (_CAN_PCS) { 142 # Use a reference as a proxy for a constant subroutine. 143 # If this is not a glob yet, it saves space. If it is 144 # a glob, we must still create it this way to get the 145 # right internal flags set, as constants are distinct 146 # from subroutines created with sub(){...}. 147 # The check in Perl_ck_rvconst knows that inlinable 148 # constants from cv_const_sv are read only. So we have to: 149 Internals::SvREADONLY($scalar, 1); 150 if ($symtab && !exists $symtab->{$name}) { 151 $symtab->{$name} = \$scalar; 152 ++$flush_mro; 153 } 154 else { 155 local $constant::{_dummy} = \$scalar; 156 *$full_name = \&{"_dummy"}; 157 } 158 } else { 159 *$full_name = sub () { $scalar }; 160 } 161 } elsif (@_) { 162 my @list = @_; 163 if (_CAN_PCS_FOR_ARRAY) { 164 _make_const($list[$_]) for 0..$#list; 165 _make_const(@list); 166 if ($symtab && !exists $symtab->{$name}) { 167 $symtab->{$name} = \@list; 168 $flush_mro++; 169 } 170 else { 171 local $constant::{_dummy} = \@list; 172 *$full_name = \&{"_dummy"}; 173 } 174 } 175 else { *$full_name = sub () { @list }; } 176 } else { 177 *$full_name = sub () { }; 178 } 179 } 180 } 181 # Flush the cache exactly once if we make any direct symbol table changes. 182 mro::method_changed_in($pkg) if _CAN_PCS && $flush_mro; 183} 184 1851; 186 187__END__ 188 189=head1 NAME 190 191constant - Perl pragma to declare constants 192 193=head1 SYNOPSIS 194 195 use constant PI => 4 * atan2(1, 1); 196 use constant DEBUG => 0; 197 198 print "Pi equals ", PI, "...\n" if DEBUG; 199 200 use constant { 201 SEC => 0, 202 MIN => 1, 203 HOUR => 2, 204 MDAY => 3, 205 MON => 4, 206 YEAR => 5, 207 WDAY => 6, 208 YDAY => 7, 209 ISDST => 8, 210 }; 211 212 use constant WEEKDAYS => qw( 213 Sunday Monday Tuesday Wednesday Thursday Friday Saturday 214 ); 215 216 print "Today is ", (WEEKDAYS)[ (localtime)[WDAY] ], ".\n"; 217 218=head1 DESCRIPTION 219 220This pragma allows you to declare constants at compile-time. 221 222When you declare a constant such as C<PI> using the method shown 223above, each machine your script runs upon can have as many digits 224of accuracy as it can use. Also, your program will be easier to 225read, more likely to be maintained (and maintained correctly), and 226far less likely to send a space probe to the wrong planet because 227nobody noticed the one equation in which you wrote C<3.14195>. 228 229When a constant is used in an expression, Perl replaces it with its 230value at compile time, and may then optimize the expression further. 231In particular, any code in an C<if (CONSTANT)> block will be optimized 232away if the constant is false. 233 234=head1 NOTES 235 236As with all C<use> directives, defining a constant happens at 237compile time. Thus, it's probably not correct to put a constant 238declaration inside of a conditional statement (like C<if ($foo) 239{ use constant ... }>). 240 241Constants defined using this module cannot be interpolated into 242strings like variables. However, concatenation works just fine: 243 244 print "Pi equals PI...\n"; # WRONG: does not expand "PI" 245 print "Pi equals ".PI."...\n"; # right 246 247Even though a reference may be declared as a constant, the reference may 248point to data which may be changed, as this code shows. 249 250 use constant ARRAY => [ 1,2,3,4 ]; 251 print ARRAY->[1]; 252 ARRAY->[1] = " be changed"; 253 print ARRAY->[1]; 254 255Dereferencing constant references incorrectly (such as using an array 256subscript on a constant hash reference, or vice versa) will be trapped at 257compile time. 258 259Constants belong to the package they are defined in. To refer to a 260constant defined in another package, specify the full package name, as 261in C<Some::Package::CONSTANT>. Constants may be exported by modules, 262and may also be called as either class or instance methods, that is, 263as C<< Some::Package->CONSTANT >> or as C<< $obj->CONSTANT >> where 264C<$obj> is an instance of C<Some::Package>. Subclasses may define 265their own constants to override those in their base class. 266 267The use of all caps for constant names is merely a convention, 268although it is recommended in order to make constants stand out 269and to help avoid collisions with other barewords, keywords, and 270subroutine names. Constant names must begin with a letter or 271underscore. Names beginning with a double underscore are reserved. Some 272poor choices for names will generate warnings, if warnings are enabled at 273compile time. 274 275=head2 List constants 276 277Constants may be lists of more (or less) than one value. A constant 278with no values evaluates to C<undef> in scalar context. Note that 279constants with more than one value do I<not> return their last value in 280scalar context as one might expect. They currently return the number 281of values, but B<this may change in the future>. Do not use constants 282with multiple values in scalar context. 283 284B<NOTE:> This implies that the expression defining the value of a 285constant is evaluated in list context. This may produce surprises: 286 287 use constant TIMESTAMP => localtime; # WRONG! 288 use constant TIMESTAMP => scalar localtime; # right 289 290The first line above defines C<TIMESTAMP> as a 9-element list, as 291returned by C<localtime()> in list context. To set it to the string 292returned by C<localtime()> in scalar context, an explicit C<scalar> 293keyword is required. 294 295List constants are lists, not arrays. To index or slice them, they 296must be placed in parentheses. 297 298 my @workdays = WEEKDAYS[1 .. 5]; # WRONG! 299 my @workdays = (WEEKDAYS)[1 .. 5]; # right 300 301=head2 Defining multiple constants at once 302 303Instead of writing multiple C<use constant> statements, you may define 304multiple constants in a single statement by giving, instead of the 305constant name, a reference to a hash where the keys are the names of 306the constants to be defined. Obviously, all constants defined using 307this method must have a single value. 308 309 use constant { 310 FOO => "A single value", 311 BAR => "This", "won't", "work!", # Error! 312 }; 313 314This is a fundamental limitation of the way hashes are constructed in 315Perl. The error messages produced when this happens will often be 316quite cryptic -- in the worst case there may be none at all, and 317you'll only later find that something is broken. 318 319When defining multiple constants, you cannot use the values of other 320constants defined in the same declaration. This is because the 321calling package doesn't know about any constant within that group 322until I<after> the C<use> statement is finished. 323 324 use constant { 325 BITMASK => 0xAFBAEBA8, 326 NEGMASK => ~BITMASK, # Error! 327 }; 328 329=head2 Magic constants 330 331Magical values and references can be made into constants at compile 332time, allowing for way cool stuff like this. (These error numbers 333aren't totally portable, alas.) 334 335 use constant E2BIG => ($! = 7); 336 print E2BIG, "\n"; # something like "Arg list too long" 337 print 0+E2BIG, "\n"; # "7" 338 339You can't produce a tied constant by giving a tied scalar as the 340value. References to tied variables, however, can be used as 341constants without any problems. 342 343=head1 TECHNICAL NOTES 344 345In the current implementation, scalar constants are actually 346inlinable subroutines. As of version 5.004 of Perl, the appropriate 347scalar constant is inserted directly in place of some subroutine 348calls, thereby saving the overhead of a subroutine call. See 349L<perlsub/"Constant Functions"> for details about how and when this 350happens. 351 352In the rare case in which you need to discover at run time whether a 353particular constant has been declared via this module, you may use 354this function to examine the hash C<%constant::declared>. If the given 355constant name does not include a package name, the current package is 356used. 357 358 sub declared ($) { 359 use constant 1.01; # don't omit this! 360 my $name = shift; 361 $name =~ s/^::/main::/; 362 my $pkg = caller; 363 my $full_name = $name =~ /::/ ? $name : "${pkg}::$name"; 364 $constant::declared{$full_name}; 365 } 366 367=head1 CAVEATS 368 369List constants are not inlined unless you are using Perl v5.20 or higher. 370In v5.20 or higher, they are still not read-only, but that may change in 371future versions. 372 373It is not possible to have a subroutine or a keyword with the same 374name as a constant in the same package. This is probably a Good Thing. 375 376A constant with a name in the list C<STDIN STDOUT STDERR ARGV ARGVOUT 377ENV INC SIG> is not allowed anywhere but in package C<main::>, for 378technical reasons. 379 380Unlike constants in some languages, these cannot be overridden 381on the command line or via environment variables. 382 383You can get into trouble if you use constants in a context which 384automatically quotes barewords (as is true for any subroutine call). 385For example, you can't say C<$hash{CONSTANT}> because C<CONSTANT> will 386be interpreted as a string. Use C<$hash{CONSTANT()}> or 387C<$hash{+CONSTANT}> to prevent the bareword quoting mechanism from 388kicking in. Similarly, since the C<< => >> operator quotes a bareword 389immediately to its left, you have to say C<< CONSTANT() => 'value' >> 390(or simply use a comma in place of the big arrow) instead of 391C<< CONSTANT => 'value' >>. 392 393=head1 SEE ALSO 394 395L<Readonly> - Facility for creating read-only scalars, arrays, hashes. 396 397L<Attribute::Constant> - Make read-only variables via attribute 398 399L<Scalar::Readonly> - Perl extension to the C<SvREADONLY> scalar flag 400 401L<Hash::Util> - A selection of general-utility hash subroutines (mostly 402to lock/unlock keys and values) 403 404=head1 BUGS 405 406Please report any bugs or feature requests via the perlbug(1) utility. 407 408=head1 AUTHORS 409 410Tom Phoenix, E<lt>F<rootbeer@redcat.com>E<gt>, with help from 411many other folks. 412 413Multiple constant declarations at once added by Casey West, 414E<lt>F<casey@geeknest.com>E<gt>. 415 416Documentation mostly rewritten by Ilmari Karonen, 417E<lt>F<perl@itz.pp.sci.fi>E<gt>. 418 419This program is maintained by the Perl 5 Porters. 420The CPAN distribution is maintained by SE<eacute>bastien Aperghis-Tramoni 421E<lt>F<sebastien@aperghis.net>E<gt>. 422 423=head1 COPYRIGHT & LICENSE 424 425Copyright (C) 1997, 1999 Tom Phoenix 426 427This module is free software; you can redistribute it or modify it 428under the same terms as Perl itself. 429 430=cut 431