内容

名称

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

如果你访问一个既未明确声明(使用 myourstateuse 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 陷阱。