NAME

strict - 安全ではない構文を制限する Perl プラグマ

SYNOPSIS

    use strict;

    use strict "vars";
    use strict "refs";
    use strict "subs";

    use strict;
    no strict "vars";

DESCRIPTION

インポートリストを与えない場合は、利用可能な全ての制約を受けます。 (これは最も安全な動作モードですが、カジュアルプログラミングの ためには厳しすぎる場合もあります。) 今のところ、"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

ouruse varsmy() で宣言された変数や完全に修飾された 変数以外にアクセスしたときにコンパイル時エラーを出します。 変数が自殺してしまう問題や微妙な動的スコープの問題があるため、 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) '...'

バージョン 1.04 (Perl 5.10) から、大文字小文字の区別のない ファイルシステムでの恐ろしい "Strict" の罠を避けるために、strict は "strict" として使われているかを検証します。