Check in a stable (working) version before next round of tweaks.
[p5sagit/p5-mst-13.2.git] / lib / vars.pm
CommitLineData
c07a80fd 1package vars;
2
fb73857a 3require 5.002;
4
b75c8c73 5our $VERSION = '1.00';
6
fb73857a 7# The following require can't be removed during maintenance
8# releases, sadly, because of the risk of buggy code that does
9# require Carp; Carp::croak "..."; without brackets dying
10# if Carp hasn't been loaded in earlier compile time. :-(
11# We'll let those bugs get found on the development track.
12require Carp if $] < 5.00450;
3d842d7f 13
14use warnings::register;
1d76c68a 15require strict;
fb73857a 16
17sub import {
18 my $callpack = caller;
19 my ($pack, @imports, $sym, $ch) = @_;
20 foreach $sym (@imports) {
fb73857a 21 ($ch, $sym) = unpack('a1a*', $sym);
014aafb8 22 if ($sym =~ tr/A-Za-z_0-9//c) {
15313f9c 23 # time for a more-detailed check-up
24 if ($sym =~ /::/) {
25 require Carp;
26 Carp::croak("Can't declare another package's variables");
27 } elsif ($sym =~ /^\w+[[{].*[]}]$/) {
28 require Carp;
29 Carp::croak("Can't declare individual elements of hash or array");
d3a7d8c7 30 } elsif (warnings::enabled() and length($sym) == 1 and $sym !~ tr/a-zA-Z//) {
31 warnings::warn("No need to declare built-in vars");
1d76c68a 32 } elsif ( $^H &= strict::bits('vars') ) {
33 Carp::croak("'$ch$sym' is not a valid variable name under strict vars");
15313f9c 34 }
35 }
fb73857a 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 : do {
43 require Carp;
15313f9c 44 Carp::croak("'$ch$sym' is not a valid variable name");
fb73857a 45 });
46 }
47};
48
491;
50__END__
51
c07a80fd 52=head1 NAME
53
86a9aef2 54vars - Perl pragma to predeclare global variable names (obsolete)
c07a80fd 55
56=head1 SYNOPSIS
57
58 use vars qw($frob @mung %seen);
59
60=head1 DESCRIPTION
61
86a9aef2 62NOTE: The functionality provided by this pragma has been superseded
63by C<our> declarations, available in Perl v5.6.0 or later. See
64L<perlfunc/our>.
65
c07a80fd 66This will predeclare all the variables whose names are
67in the list, allowing you to use them under "use strict", and
68disabling any typo warnings.
69
55497cff 70Unlike pragmas that affect the C<$^H> hints variable, the C<use vars> and
71C<use subs> declarations are not BLOCK-scoped. They are thus effective
72for the entire file in which they appear. You may not rescind such
73declarations with C<no vars> or C<no subs>.
74
7a2e2cd6 75Packages such as the B<AutoLoader> and B<SelfLoader> that delay
76loading of subroutines within packages can create problems with
77package lexicals defined using C<my()>. While the B<vars> pragma
78cannot duplicate the effect of package lexicals (total transparency
79outside of the package), it can act as an acceptable substitute by
80pre-declaring global symbols, ensuring their availability to the
81later-loaded routines.
c6f23971 82
ee580363 83See L<perlmodlib/Pragmatic Modules>.
c07a80fd 84
85=cut