strict - 安全ではない構文を制限する Perl プラグマ
use strict;
use strict "vars";
use strict "refs";
use strict "subs";
use strict;
no strict "vars";
インポートリストを与えない場合は、利用可能な全ての制約を受けます。 (これは最も安全な動作モードですが、カジュアルプログラミングの ためには厳しすぎる場合もあります。) 今のところ、"subs"、"vars"、"refs" の 3 つの制約が用意されています。
strict refs
シンボリックリファレンスが使われたときに実行時エラーになります。 (perlref を見てください。)
use strict 'refs';
$ref = \$foo;
print $$ref; # ok
$ref = "foo";
print $$ref; # ランタイムエラー; 普段は ok
$file = "STDOUT";
print $file "Hi!"; # エラー; 注意: $file の後にコンマがない
このルールには 1 つの例外があります:
$bar = \&{'foo'};
&$bar;
上記のものは許容されます; だから goto &$AUTOLOAD
はこの制約下でも動きます。
strict vars
our
や use vars
、my()
で宣言された変数や完全に修飾された 変数以外にアクセスしたときにコンパイル時エラーを出します。 変数が自殺してしまう問題や微妙な動的スコープの問題があるため、 local() 変数だけでは十分ではありません。 "my" in perlfunc や "local" in perlfunc を見てください。
use strict 'vars';
$X::foo = 1; # ok, 完全に修飾されています
my $foo = 10; # ok, my() 変数
local $foo = 9; # ダメ
package Cinna;
our $bar; # パッケージ内で宣言された $bar
$bar = 'HgS'; # ok, プラグマでグローバルに宣言された
local() は、完全な修飾無しにグローバルな名前を触ってしまうため コンパイル時エラーを出します。
sort() によって特別扱いされるという理由で $a と $b はこのチェックの 適用外になっています。
strict subs
詩的な最適化を禁止し、サブルーチン以外の裸の識別子を使おうとしたとき、 それが(コロンのない)単純な識別子や中括弧の中 =>
シンボルの 左側でない場合にコンパイル時エラーを出します。
use strict 'subs';
$SIG{PIPE} = Plumber; # ダメ
$SIG{PIPE} = "Plumber"; # 問題なし: クォートされた文字は常に ok
$SIG{PIPE} = \&Plumber; # 好ましい方法
"Pragmatic Modules" in perlmodlib を見てください。
Perl 5.6.1 での strict 'subs'
は、(=>
の前や中括弧の中での) ハッシュのキーのとして、クォートすることなしに(Foo::Bar
のような) 複合の識別子を使えるようにしてしまっています; このことは間違いでした; それは、いつでもリテラル文字列です。
Perl 5.8.1 からの strict は、それらの制約事項について厳格です: もし、知られていない制約事項が使われるならば、strict プラグマは、 以下のような出力と共に中断します。
Unknown 'strict' tag(s) '...'
バージョン 1.04 (Perl 5.10) から、大文字小文字の区別のない ファイルシステムでの恐ろしい "Strict" の罠を避けるために、strict は "strict" として使われているかを検証します。