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