=encoding euc-jp =head1 NAME strict - 安全ではないコンストラクトを制限する Perl プラグマ =head1 SYNOPSIS use strict; use strict "vars"; use strict "refs"; use strict "subs"; use strict; no strict "vars"; =head1 DESCRIPTION インポートリストを与えない場合は、可能な限り全ての制約を受けます。 (これは、最も安全な動作モードです。ただ、カジュアルプログラミング のためには厳しすぎます。)今のところ、"subs"、"vars"、"refs" の 3つの制約が用意されています。 =over 6 =item C シンボリックリファレンスが使われたときにランタイムエラーになります。 (L を見てください。) use strict 'refs'; $ref = \$foo; print $$ref; # ok $ref = "foo"; print $$ref; # ランタイムエラー; 普段は ok $file = "STDOUT"; print $file "Hi!"; # エラー; note: $file の後にコンマがない。 このルールには 1つの例外があります。 $bar = \&{'foo'}; &$bar; 上記のものは許容されます。だから C はこの制約下でも 動きます。 =item C C や C、C で宣言された変数や完全に修飾された 変数以外にアクセスしたときにコンパイル時エラーを出します。 変数が自殺してしまう問題や微表な動的スコープの問題があるため、 local() 変数だけでは十分ではありません。L や L を見てください。 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 はこのチェックの 適用外という特別扱いになっています。 =item C 詩的な最適化を禁止し、サブルーチン以外の裸の識別子を使おうとしたときか、 (コロンのない)単純な識別子や中括弧の中 C<< => >> シンボルの左側に 無いときにコンパイル時エラーを出します。 use strict 'subs'; $SIG{PIPE} = Plumber; # ダメ $SIG{PIPE} = "Plumber"; # 問題なし: 中括弧の中ならいつでも裸で ok $SIG{PIPE} = \&Plumber; # 好ましい方法 =back L を見てください。 =head1 HISTORY Perl 5.6.1 での C は、(C<< => >> の前や中括弧の中での) ハッシュのキーのとしてクオートすることなしに(C のような) 複合の識別子を使えるようにしてしまっています。このことは間違いでした。 それは、いつでもリテラル文字列です。 Perl 5.8.1 からの strict は、それらの制約事項について厳格です: もし、知られていない制約事項が使われるならば、strict プラグマは、 次にある記述と共に中断するでしょう。 Unknown 'strict' tag(s) '...' =cut