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