strict - Perl pragma 用于限制不安全的构造
use strict;
use strict "vars";
use strict "refs";
use strict "subs";
use strict;
no strict "vars";
strict
pragma 禁用某些 Perl 表达式,这些表达式可能表现得意外或难以调试,并将其转换为错误。此 pragma 的效果仅限于当前文件或作用域块。
如果没有提供导入列表,则假定所有可能的限制。(这是最安全的运行模式,但有时对于普通编程来说过于严格。)目前,有三种可能需要严格对待的事情:“subs”、“vars”和“refs”。
strict refs
如果您使用符号引用(请参阅 perlref),这将生成一个运行时错误。
use strict 'refs';
$ref = \$foo;
print $$ref; # ok
$ref = "foo";
print $$ref; # runtime error; normally ok
$file = "STDOUT";
print $file "Hi!"; # error; note: no comma after $file
此规则有一个例外
$bar = \&{'foo'};
&$bar;
允许,以便 goto &$AUTOLOAD
在严格限制下不会中断。
strict vars
如果你访问一个既未明确声明(使用 my
、our
、state
或 use vars
中的任何一个)也未完全限定的变量,这会生成一个编译时错误。(因为这是为了避免变量自杀问题和微妙的动态作用域问题,仅仅是 local
变量是不够的。)请参阅 perlfunc 中的“my”、perlfunc 中的“our”、perlfunc 中的“state”、perlfunc 中的“local” 和 vars。
use strict 'vars';
$X::foo = 1; # ok, fully qualified
my $foo = 10; # ok, my() var
local $baz = 9; # blows up, $baz not declared before
package Cinna;
our $bar; # Declares $bar in current package
$bar = 'HgS'; # ok, global declared via pragma
local() 生成了一个编译时错误,因为你刚刚接触了一个全局名称,而没有完全限定它。
由于 sort() 对变量 $a 和 $b 有特殊用途,因此这些变量不受此检查的约束。
strict subs
这会禁用 poetry 优化,如果你尝试使用一个不是子例程的裸字标识符,则会生成一个编译时错误,除非它是一个简单的标识符(没有冒号),并且它出现在大括号中、=>
符号的左侧,或对其应用了一元减运算符。
use strict 'subs';
$SIG{PIPE} = Plumber; # blows up
$SIG{PIPE} = "Plumber"; # fine: quoted string is always ok
$SIG{PIPE} = \&Plumber; # preferred form
请参阅 perlmodlib 中的“Pragmatic Modules”。
strict 'subs'
在 Perl 5.6.1 中错误地允许将未加引号的复合标识符(例如 Foo::Bar
)用作哈希键(在 =>
之前或在大括号内),但不会始终将其强制为一个文字字符串。
从 Perl 5.8.1 开始,strict 对其限制非常严格:如果使用了未知的限制,strict pragma 将中止,并显示
Unknown 'strict' tag(s) '...'
从 1.04 版(Perl 5.10)开始,strict 验证它被用作“strict”,以避免在不区分大小写的文件系统上出现可怕的 Strict 陷阱。