iwai****@users*****
iwai****@users*****
2011年 2月 28日 (月) 08:32:35 JST
Index: docs/perl/5.12.3/strict.pod diff -u /dev/null docs/perl/5.12.3/strict.pod:1.1 --- /dev/null Mon Feb 28 08:32:35 2011 +++ docs/perl/5.12.3/strict.pod Mon Feb 28 08:32:34 2011 @@ -0,0 +1,107 @@ + +=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<strict refs> + +シンボリックリファレンスが使われたときにランタイムエラーになります。 +(L<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; + +上記のものは許容されます。だから C<goto &$AUTOLOAD> はこの制約下でも +動きます。 + + + +=item C<strict vars> + +C<our> や C<use vars>、C<my()> で宣言された変数や完全に修飾された +変数以外にアクセスしたときにコンパイル時エラーを出します。 +変数が自殺してしまう問題や微表な動的スコープの問題があるため、 local() +変数だけでは十分ではありません。L<perlfunc/my> や L<perlfunc/local> +を見てください。 + + 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<strict subs> + +詩的な最適化を禁止し、サブルーチン以外の裸の識別子を使おうとしたときか、 +(コロンのない)単純な識別子や中括弧の中 C<< => >> シンボルの左側に +無いときにコンパイル時エラーを出します。 + + use strict 'subs'; + $SIG{PIPE} = Plumber; # ダメ + $SIG{PIPE} = "Plumber"; # 問題なし: クオートされた文字列なら常に ok + $SIG{PIPE} = \&Plumber; # 好ましい方法 + +=back + +L<perlmodlib/Pragmatic Modules> を見てください。 + +=head1 HISTORY + +Perl 5.6.1 での C<strict 'subs'> は、(C<< => >> の前や中括弧の中での) +ハッシュのキーのとしてクオートすることなしに(C<Foo::Bar> のような) +複合の識別子を使えるようにしてしまっています。このことは間違いでした。 +それは、いつでもリテラル文字列です。 + +Perl 5.8.1 からの strict は、それらの制約事項について厳格です: +もし、知られていない制約事項が使われるならば、strict プラグマは、 +次にある記述と共に中断するでしょう。 + + Unknown 'strict' tag(s) '...' + +バージョン 1.04 (Perl 5.10) から、大文字小文字の区別のない +ファイルシステムでの恐ろしい "Strict" の罠 (Strict trap) +を避けるために、strict は "strict" として使われているかを検証します。 + + +