內容

名稱

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

這會停用詩歌最佳化,如果您嘗試使用不是子常式的裸字識別碼,則會產生編譯時期錯誤,除非它是一個簡單識別碼 (沒有冒號),而且它出現在大括弧中,在 => 符號的左手邊,或對它套用了一元減號運算子。

use strict 'subs';
$SIG{PIPE} = Plumber;   # blows up
$SIG{PIPE} = "Plumber"; # fine: quoted string is always ok
$SIG{PIPE} = \&Plumber; # preferred form

請參閱 perlmodlib 中的「實用模組」

歷程記錄

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 陷阱。