名前¶
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!"; # エラー; note: $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 を見てください。
HISTORY¶
Perl 5.6.1 での strict 'subs'
は、(=>
の前や中括弧の中での) ハッシュのキーのとしてクオートすることなしに(Foo::Bar
のような) 複合の識別子を使えるようにしてしまっています。このことは間違いでした。 それは、いつでもリテラル文字列です。
Perl 5.8.1 からの strict は、それらの制約事項について厳格です: もし、知られていない制約事項が使われるならば、strict プラグマは、 次にある記述と共に中断するでしょう。
Unknown 'strict' tag(s) '...'