5.8.1 > strict

名前

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

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) '...'