xref: /openbsd-src/gnu/usr.bin/perl/dist/constant/lib/constant.pm (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
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