1package strict; 2 3=head1 NAME 4 5strict - Perl pragma to restrict unsafe constructs 6 7=head1 SYNOPSIS 8 9 use strict; 10 11 use strict "vars"; 12 use strict "refs"; 13 use strict "subs"; 14 15 use strict; 16 no strict "vars"; 17 18=head1 DESCRIPTION 19 20If no import list is supplied, all possible restrictions are assumed. 21(This is the safest mode to operate in, but is sometimes too strict for 22casual programming.) Currently, there are three possible things to be 23strict about: "subs", "vars", and "refs". 24 25=over 6 26 27=item C<strict refs> 28 29This generates a runtime error if you 30use symbolic references (see L<perlref>). 31 32 use strict 'refs'; 33 $ref = \$foo; 34 print $$ref; # ok 35 $ref = "foo"; 36 print $$ref; # runtime error; normally ok 37 $file = "STDOUT"; 38 print $file "Hi!"; # error; note: no comma after $file 39 40There is one exception to this rule: 41 42 $bar = \&{'foo'}; 43 &$bar; 44 45is allowed so that C<goto &$AUTOLOAD> would not break under stricture. 46 47 48=item C<strict vars> 49 50This generates a compile-time error if you access a variable that wasn't 51declared via "our" or C<use vars>, 52localized via C<my()>, or wasn't fully qualified. Because this is to avoid 53variable suicide problems and subtle dynamic scoping issues, a merely 54local() variable isn't good enough. See L<perlfunc/my> and 55L<perlfunc/local>. 56 57 use strict 'vars'; 58 $X::foo = 1; # ok, fully qualified 59 my $foo = 10; # ok, my() var 60 local $foo = 9; # blows up 61 62 package Cinna; 63 our $bar; # Declares $bar in current package 64 $bar = 'HgS'; # ok, global declared via pragma 65 66The local() generated a compile-time error because you just touched a global 67name without fully qualifying it. 68 69Because of their special use by sort(), the variables $a and $b are 70exempted from this check. 71 72=item C<strict subs> 73 74This disables the poetry optimization, generating a compile-time error if 75you try to use a bareword identifier that's not a subroutine, unless it 76appears in curly braces or on the left hand side of the "=E<gt>" symbol. 77 78 79 use strict 'subs'; 80 $SIG{PIPE} = Plumber; # blows up 81 $SIG{PIPE} = "Plumber"; # just fine: bareword in curlies always ok 82 $SIG{PIPE} = \&Plumber; # preferred form 83 84 85 86=back 87 88See L<perlmodlib/Pragmatic Modules>. 89 90 91=cut 92 93$strict::VERSION = "1.01"; 94 95my %bitmask = ( 96refs => 0x00000002, 97subs => 0x00000200, 98vars => 0x00000400 99); 100 101sub bits { 102 my $bits = 0; 103 foreach my $s (@_){ $bits |= $bitmask{$s} || 0; }; 104 $bits; 105} 106 107sub import { 108 shift; 109 $^H |= bits(@_ ? @_ : qw(refs subs vars)); 110} 111 112sub unimport { 113 shift; 114 $^H &= ~ bits(@_ ? @_ : qw(refs subs vars)); 115} 116 1171; 118