どうやらuse strict
perlを強制的に適切にコーディングしたいときは、(強制的に)宣言を強制したり、文字列やサブワード、つまり裸語を明示したり、refを注意深く使用したりする必要があるときに使用する必要があります。注:エラーがある場合、strictを使用すると、使用すると実行が中止されます。
一方でuse warnings;
、あなたはセミコロンを逃したように、あなたは「ELSIF」「のelseif」を使用していないプログラムに入力ミスを見つけましょう、あなたはどのようなことのように、非推奨の構文や関数を使用しています。注:警告を使用すると、警告のみが表示され、実行が継続されます。つまり、実行が中止されません。
とにかく、以下で詳しく説明しますが、詳細に進むとよいでしょう。
perl.com(私のお気に入り):
厳密な「vars」を使用してください。
つまり、変数を使用する前に、常に変数を宣言する必要があります。
宣言しない場合、おそらく宣言されていない変数のエラーメッセージが表示されます。
グローバルシンボル「$ variablename」には、scriptname.pl行3に明示的なパッケージ名が必要です
この警告は、変数のスコープが何であるかについてPerlが正確に明確ではないことを意味します。したがって、変数について明示する必要があります。つまりmy
、現在のブロックに制限されるように変数を宣言するか、完全修飾名(例:$ MAIN :: variablename)で変数を参照します。
したがって、以下の基準の少なくとも1つを満たさない変数にアクセスしようとすると、コンパイル時エラーがトリガーされます。
@ ARGV、%ENVなどのPerl自体によって事前定義され、$などのすべてのグローバル句読点変数。または$ _。
私たち(グローバルの場合)またはmy(語彙の場合)で宣言されています。
別のパッケージからインポートされました。(use varsプラグマはインポートを偽装しますが、代わりに私たちを使用してください。)
パッケージ名とダブルコロンのパッケージ区切り文字を使用して完全修飾。
厳密な「サブ」を使用してください。
2つのプログラムを検討する
# prog 1
$a = test_value;
print "First program: ", $a, "\n";
sub test_value { return "test passed"; }
Output: First program's result: test_value
# prog 2
sub test_value { return "test passed"; }
$a = test_value;
print "Second program: ", $a, "\n";
Output: Second program's result: test passed
どちらの場合も、test_value()サブルーチンがあり、その結果を$ aに入れます。しかし、2つのプログラムを実行すると、2つの異なる結果が得られます。
最初のプログラムでは、に到達した時点で$a = test_value;
、Perlはtest_value()サブルーチンを認識しておらず、test_valueは文字列 'test_value'として解釈されます。2番目のプログラムでは、test_value()の定義が$a = test_value;
行の前にあります。Perlはtest_valueをサブ呼び出しと見なします。
潜水艦かもしれないし、コンテキストに応じた文字列であるかもしれないtest_valueのような孤立した単語のための専門用語は、方法によって、ある裸の単語。Perlのベアワードの処理は混乱を招く可能性があり、プログラムにバグを引き起こす可能性があります。
バグは最初のプログラムで発生したものですtest_value()
。Perlはfindを楽しみにしないので、test_value()をまだ見ていないため、文字列が必要であると想定しています。したがって、の場合use strict subs;
、このプログラムはエラーで終了します。
./a6-strictsubs.plの3行目で「strict subs」を使用している場合、単語「test_value」は許可されません。
このエラーの解決策は
1です。括弧を使用して、サブルーチンを呼び出していることを明確にします。Perlが$ a = test_value();を検出した場合、
2。最初に使用する前にサブルーチンを宣言します。
use strict;
sub test_value; # Declares that there's a test_value() coming later ...
my $a = test_value; # ...so Perl will know this line is okay.
.......
sub test_value { return "test_passed"; }
3.そして、それを文字列として使用するつもりなら、引用符で囲みます。
したがって、この制限により、Perlはすべての裸語を構文エラーとして扱います。* ベアワードは、コンテキストによって強制される他の解釈がないベアネームまたは識別子です。(コンテキストは多くの場合、近くのキーワードまたはトークン、または問題の単語の事前宣言によって強制されます。)*文字列として使用する場合は引用符で囲み、関数呼び出しとして使用する場合は事前宣言してくださいまたは括弧を使用します。
ベアワードは、この予測できない動作のために危険です。use strict; (or use strict 'subs';)
将来奇妙な振る舞いを引き起こす可能性のある裸の言葉は、彼らが大混乱をもたらす前にあなたのプログラムを死にさせるので、それらを予測可能にします
厳密なサブをオンにしている場合でも、ベアワードを使用しても問題ない場所が1つあります。それは、ハッシュキーを割り当てるときです。
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
ハッシュキーのベアワードは常に文字列として解釈されるため、あいまいさはありません。
厳密な「参照」を使用します。
これにより、意図的に、またはその他の方法でシンボリック参照を使用すると、実行時エラーが発生します。ハード参照ではない値は、シンボリック参照として扱われます。つまり、参照はグローバル変数の名前を表す文字列として解釈されます。
use strict 'refs';
$ref = \$foo; # Store "real" (hard) reference.
print $$ref; # Dereferencing is ok.
$ref = "foo"; # Store name of global (package) variable.
print $$ref; # WRONG, run-time error under strict refs.
警告を使用します。
このレキシカルスコープのプラグマにより、Perlの組み込み警告を柔軟に制御できます。コンパイラによって生成される警告と、ランタイムシステムから生成される警告の両方が可能です。
からperldiag
:
したがって、以下の分類からの警告メッセージの大部分、つまりW、D、Sは、warnings
プラグマを使用して制御できます。
(W)警告(オプション)
(D)非推奨(デフォルトで有効)
(S)重大な警告(デフォルトで有効)
以下に頻繁に発生する警告メッセージのいくつかを分類別にリストしました。それらと他のメッセージの詳細についてはperldiagを参照してください
(W)警告(オプション):
%sの
引数がありません-%cの引数がありません
(代わりに&%s
を意味しましたか?)( "our"ではなく "local"
を意味しましたか?)(%ではなく$または@を意味しましたか?)
'%s 「コード基準ない
%Sに使用される)(長さ
数_見当違い
(D)非推奨(デフォルトで有効):
defined(@array)は非推奨です
defined(%hash)は非
推奨ですfalse条件でのmy()の非推奨の使用
$#はサポートされなくなりました
(S)重大な警告(デフォルトで有効)
ELSEIFはELSIFする必要があり
、オペレータが期待%sのFOUND
(%sの前に演算子がありませんが?)
(前の行にセミコロンがありません?)
%sの導入決して
%sの前に行方不明演算子またはセミコロン
の優先順位の問題:オープン%sが開いている必要があります(%sの)
プロトタイプの不一致:%sと%s
警告:括弧なしの "%s"の使用があいまい
です%sを開けません:%s
use loose;