perl 5.003_01: pod/perlfunc.pod
[p5sagit/p5-mst-13.2.git] / lib / vars.pm
CommitLineData
c07a80fd 1package vars;
2
3=head1 NAME
4
5vars - Perl pragma to predeclare global variable names
6
7=head1 SYNOPSIS
8
9 use vars qw($frob @mung %seen);
10
11=head1 DESCRIPTION
12
13This will predeclare all the variables whose names are
14in the list, allowing you to use them under "use strict", and
15disabling any typo warnings.
16
c6f23971 17Packages such as the B<AutoLoader> and B<SelfLoader> that delay loading
18of subroutines within packages can create problems with package lexicals
19defined using C<my()>. While the B<vars> pragma cannot duplicate the
20effect of package lexicals (total transparency outside of the package),
21it can act as an acceptable substitute by pre-declaring global symbols,
22ensuring their availability to to the later-loaded routines.
23
c07a80fd 24See L<perlmod/Pragmatic Modules>.
25
26=cut
27require 5.000;
28use Carp;
29
30sub import {
31 my $callpack = caller;
32 my ($pack, @imports, $sym, $ch) = @_;
33 foreach $sym (@imports) {
34 croak "Can't declare another package's variables" if $sym =~ /::/;
35 ($ch, $sym) = unpack('a1a*', $sym);
36 *{"${callpack}::$sym"} =
37 ( $ch eq "\$" ? \$ {"${callpack}::$sym"}
38 : $ch eq "\@" ? \@ {"${callpack}::$sym"}
39 : $ch eq "\%" ? \% {"${callpack}::$sym"}
40 : $ch eq "\*" ? \* {"${callpack}::$sym"}
41 : $ch eq "\&" ? \& {"${callpack}::$sym"}
42 : croak "'$ch$sym' is not a valid variable name\n");
43 }
44};
45
461;