package strict;
-$strict::VERSION = "1.07";
+$strict::VERSION = "1.10";
# Verify that we're called correctly so that strictures will work.
unless ( __FILE__ =~ /(^|[\/\\])\Q${\__PACKAGE__}\E\.pmc?$/ ) {
die("Incorrect use of pragma '${\__PACKAGE__}' at $f line $l.\n");
}
-my %bitmask = (
-refs => 0x00000002,
-subs => 0x00000200,
-vars => 0x00000400
-);
+my ( %bitmask, %explicit_bitmask );
+
+BEGIN {
+ %bitmask = (
+ refs => 0x00000002,
+ subs => 0x00000200,
+ vars => 0x00000400,
+ );
+
+ %explicit_bitmask = (
+ refs => 0x00000020,
+ subs => 0x00000040,
+ vars => 0x00000080,
+ );
+
+ my $bits = 0;
+ $bits |= $_ for values %bitmask;
+
+ my $inline_all_bits = $bits;
+ *all_bits = sub () { $inline_all_bits };
+
+ $bits = 0;
+ $bits |= $_ for values %explicit_bitmask;
+
+ my $inline_all_explicit_bits = $bits;
+ *all_explicit_bits = sub () { $inline_all_explicit_bits };
+}
sub bits {
my $bits = 0;
my @wrong;
foreach my $s (@_) {
- if (exists $bitmask{$s}) {
- $^H{"strict/$s"} = undef;
- }
- else { push @wrong, $s };
- $bits |= $bitmask{$s} || 0;
+ if (exists $bitmask{$s}) {
+ $^H |= $explicit_bitmask{$s};
+
+ $bits |= $bitmask{$s};
+ }
+ else {
+ push @wrong, $s;
+ }
}
if (@wrong) {
require Carp;
$bits;
}
-my @default_bits = qw(refs subs vars);
-
sub import {
shift;
- $^H |= bits(@_ ? @_ : @default_bits);
+ $^H |= @_ ? &bits : all_bits | all_explicit_bits;
}
sub unimport {
shift;
- $^H &= ~ bits(@_ ? @_ : @default_bits);
+
+ if (@_) {
+ $^H &= ~&bits;
+ }
+ else {
+ $^H &= ~all_bits;
+ $^H |= all_explicit_bits;
+ }
}
1;
=head1 DESCRIPTION
+The C<strict> pragma disables certain Perl expressions that could behave
+unexpectedly or are difficult to debug, turning them into errors. The
+effect of this pragma is limited to the current file or scope block.
+
If no import list is supplied, all possible restrictions are assumed.
(This is the safest mode to operate in, but is sometimes too strict for
casual programming.) Currently, there are three possible things to be
on the left hand side of the C<< => >> symbol.
use strict 'subs';
- $SIG{PIPE} = Plumber; # blows up
- $SIG{PIPE} = "Plumber"; # just fine: quoted string is always ok
- $SIG{PIPE} = \&Plumber; # preferred form
+ $SIG{PIPE} = Plumber; # blows up
+ $SIG{PIPE} = "Plumber"; # fine: quoted string is always ok
+ $SIG{PIPE} = \&Plumber; # preferred form
=back