use strict; # apply all possible restrictions use strict 'vars'; # restrict unsafe use of variables for rest of block use strict 'refs'; # restrict unsafe use of references for rest of block use strict 'subs'; # restrict unsafe use of barewords for rest of block no strict 'vars'; # relax restrictions on variables for rest of block no strict 'refs'; # relax restrictions on references for rest of block no strict 'subs'; # relax restrictions on barewords for rest of block
If no import list is given to use strict
, all possible restrictions
upon unsafe Perl constructs are imposed. (This is the safest mode to
operate in, but is sometimes too
strict for casual programming.) Currently, there are three possible things
to be strict about: refs
, vars
, and subs
.
In all cases the restrictions apply only until the end of the immediately enclosing block.
strict 'refs'
This generates a run-time error if you use symbolic references.
use strict 'refs'; $ref = \$foo; print $$ref; # ok $ref = "foo"; print $$ref; # run-time error; normally ok
strict 'vars'
This generates a compile-time error if you access a variable that wasn't declared via my, or fully qualified, or imported.
use strict 'vars'; use vars '$foe'; $SomePack::fee = 1; # ok, fully qualified my $fie = 10; # ok, my() var $foe = 7; # ok, pseudo-imported by 'use vars' $foo = 9; # blows up--did you mistype $foe maybe?
The last line generates a compile-time error because you're touching a
global name without fully qualifying it. Since the purpose of this
pragma is to encourage use of my variables, using local on a
variable isn't good enough to declare it. You can, however, use
local on a variable that you declared with use vars
.
strict 'subs'
This generates a compile-time error if you try to use a bareword identifier that's not a predeclared subroutine.
use strict 'subs'; $SIG{PIPE} = Plumber; # blows up (assuming Plumber sub not declared yet) $SIG{PIPE} = "Plumber"; # okay, means "main::Plumber" really $SIG{PIPE} = \&Plumber; # preferred form
The no strict 'vars'
statement negates any preceding use strict
vars
for the remainder of the innermost enclosing block. Likewise,
no strict 'refs'
negates any preceding invocation of use strict
refs
, and no strict 'subs'
negates use strict 'subs'
.
The arguments to use strict
are sometimes given as barewords - that is,
without surrounding quotes. Be aware, however, that the following
sequence will not work:
use strict; # or just: use strict subs; ... no strict subs; # WRONG! Should be: no strict 'subs'; ...
The problem here is that giving subs
as a bareword is no longer allowed
after the use strict
statement. :-)