This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
lib/unicore/mktables: use function signatures
[perl5.git] / lib / vars.pm
1 package vars;
2
3 use 5.006;
4
5 our $VERSION = '1.05';
6
7 use warnings::register;
8 use strict qw(vars subs);
9
10 sub import {
11     my $callpack = caller;
12     my (undef, @imports) = @_;
13     my ($sym, $ch);
14     foreach (@imports) {
15         if (($ch, $sym) = /^([\$\@\%\*\&])(.+)/) {
16             if ($sym =~ /\W/) {
17                 # time for a more-detailed check-up
18                 if ($sym =~ /^\w+[[{].*[]}]$/) {
19                     require Carp;
20                     Carp::croak("Can't declare individual elements of hash or array");
21                 } elsif (warnings::enabled() and length($sym) == 1 and $sym !~ tr/a-zA-Z//) {
22                     warnings::warn("No need to declare built-in vars");
23                 } elsif  (($^H & strict::bits('vars'))) {
24                     require Carp;
25                     Carp::croak("'$_' is not a valid variable name under strict vars");
26                 }
27             }
28             $sym = "${callpack}::$sym" unless $sym =~ /::/;
29             *$sym =
30                 (  $ch eq "\$" ? \$$sym
31                  : $ch eq "\@" ? \@$sym
32                  : $ch eq "\%" ? \%$sym
33                  : $ch eq "\*" ? \*$sym
34                  : $ch eq "\&" ? \&$sym 
35                  : do {
36                      require Carp;
37                      Carp::croak("'$_' is not a valid variable name");
38                  });
39         } else {
40             require Carp;
41             Carp::croak("'$_' is not a valid variable name");
42         }
43     }
44 };
45
46 1;
47 __END__
48
49 =head1 NAME
50
51 vars - Perl pragma to predeclare global variable names
52
53 =head1 SYNOPSIS
54
55     use vars qw($frob @mung %seen);
56
57 =head1 DESCRIPTION
58
59 NOTE: For use with variables in the current package for a single scope, the
60 functionality provided by this pragma has been superseded by C<our>
61 declarations, available in Perl v5.6.0 or later, and use of this pragma is
62 discouraged.  See L<perlfunc/our>.
63
64 This pragma will predeclare all the variables whose names are
65 in the list, allowing you to use them under C<use strict>, and
66 disabling any typo warnings for them.
67
68 Unlike pragmas that affect the C<$^H> hints variable, the C<use vars> and
69 C<use subs> declarations are not lexically scoped to the block they appear
70 in: they affect
71 the entire package in which they appear.  It is not possible to rescind these
72 declarations with C<no vars> or C<no subs>.
73
74 Packages such as the B<AutoLoader> and B<SelfLoader> that delay
75 loading of subroutines within packages can create problems with
76 package lexicals defined using C<my()>. While the B<vars> pragma
77 cannot duplicate the effect of package lexicals (total transparency
78 outside of the package), it can act as an acceptable substitute by
79 pre-declaring global symbols, ensuring their availability to the
80 later-loaded routines.
81
82 See L<perlmodlib/Pragmatic Modules>.
83
84 =cut