This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Continue what #4494 started; introduce uid and gid formats.
[perl5.git] / lib / vars.pm
CommitLineData
c07a80fd 1package vars;
2
fb73857a 3require 5.002;
4
5# The following require can't be removed during maintenance
6# releases, sadly, because of the risk of buggy code that does
7# require Carp; Carp::croak "..."; without brackets dying
8# if Carp hasn't been loaded in earlier compile time. :-(
9# We'll let those bugs get found on the development track.
10require Carp if $] < 5.00450;
11
12sub import {
13 my $callpack = caller;
14 my ($pack, @imports, $sym, $ch) = @_;
15 foreach $sym (@imports) {
fb73857a 16 ($ch, $sym) = unpack('a1a*', $sym);
014aafb8 17 if ($sym =~ tr/A-Za-z_0-9//c) {
15313f9c
TP
18 # time for a more-detailed check-up
19 if ($sym =~ /::/) {
20 require Carp;
21 Carp::croak("Can't declare another package's variables");
22 } elsif ($sym =~ /^\w+[[{].*[]}]$/) {
23 require Carp;
24 Carp::croak("Can't declare individual elements of hash or array");
25 } elsif ($^W and length($sym) == 1 and $sym !~ tr/a-zA-Z//) {
26 require Carp;
27 Carp::carp("No need to declare built-in vars");
28 }
29 }
fb73857a 30 *{"${callpack}::$sym"} =
31 ( $ch eq "\$" ? \$ {"${callpack}::$sym"}
32 : $ch eq "\@" ? \@ {"${callpack}::$sym"}
33 : $ch eq "\%" ? \% {"${callpack}::$sym"}
34 : $ch eq "\*" ? \* {"${callpack}::$sym"}
35 : $ch eq "\&" ? \& {"${callpack}::$sym"}
36 : do {
37 require Carp;
15313f9c 38 Carp::croak("'$ch$sym' is not a valid variable name");
fb73857a 39 });
40 }
41};
42
431;
44__END__
45
c07a80fd 46=head1 NAME
47
48vars - Perl pragma to predeclare global variable names
49
50=head1 SYNOPSIS
51
52 use vars qw($frob @mung %seen);
53
54=head1 DESCRIPTION
55
56This will predeclare all the variables whose names are
57in the list, allowing you to use them under "use strict", and
58disabling any typo warnings.
59
55497cff 60Unlike pragmas that affect the C<$^H> hints variable, the C<use vars> and
61C<use subs> declarations are not BLOCK-scoped. They are thus effective
62for the entire file in which they appear. You may not rescind such
63declarations with C<no vars> or C<no subs>.
64
7a2e2cd6 65Packages such as the B<AutoLoader> and B<SelfLoader> that delay
66loading of subroutines within packages can create problems with
67package lexicals defined using C<my()>. While the B<vars> pragma
68cannot duplicate the effect of package lexicals (total transparency
69outside of the package), it can act as an acceptable substitute by
70pre-declaring global symbols, ensuring their availability to the
71later-loaded routines.
c6f23971 72
ee580363 73See L<perlmodlib/Pragmatic Modules>.
c07a80fd 74
75=cut