コマンドラインスイッチまたはプラグマでPerl警告を有効にする必要がありますか?
質問
Perlスクリプトを開始するための以下の2つの例に違いはありますか?もしそうなら、いつ私は一方をもう一方の上に使用しますか?
例1:
#!/usr/bin/perl
use warnings;
例2:
#!/usr/bin/perl -w
解決
スイッチを使用すると、プログラムで使用される all モジュールのすべての警告が有効になります。プラグマを使用して、その特定のモジュール(またはスクリプト)でのみ有効にします。理想的には、すべてのモジュールで警告を使用しますが、多くの場合そうではありません。スイッチを使用すると、警告に対して安全ではないサードパーティのモジュールを使用しているときに多くの警告を受け取ることができます。
したがって、理想的には重要ではありませんが、実用的には、エンドユーザーがスイッチではなくプラグマを使用することが望ましい場合があります。
他のヒント
-w
コマンドラインスイッチは、インタープリター全体に対してグローバルに警告をオンにします。一方、 use warnings
は「字句プラグマ」です;そして、それが使用されているレキシカルスコープにのみ適用されます。通常、ファイル全体に適用されるようにファイルの先頭に配置しますが、特定のブロックにスコープを設定することもできます。さらに、別の方法で警告を生成する動作を行う必要がある場合は、 no warnings
を使用して、ブロック内で一時的にそれらをオフにすることができます。 -w
をオンにしている場合、それを行うことはできません。
レキシカル警告のさまざまなサブセットのオン/オフを切り替える方法など、レキシカル警告の仕組みの詳細については、をご覧ください。 perllexwarn ドキュメント。
" -w"は古いもので、警告を有効にする唯一の方法でした(実際には" -w"はグローバルな$ ^ W変数を有効にします)。 "警告を使用;" (すでに述べたように)グローバルスコープではなくレキシカルスコープを持ち、特定の警告をオン/オフできるため、(バージョン5.6.0以降)が推奨されます。また、" use strict;"で始まることも忘れないでください。 :-)
注目に値するもう1つの違いは、「警告を使用する」ということです。プラグマでは、特定の警告を選択して有効にすることもできます(同様に、「警告なし」を使用すると、無効にする警告を選択できます)。
プラグマを使用して特定のアサーションを有効/無効にすることに加えて、一部またはすべての警告をエラーに昇格させることもできます:
use strict;
use warnings FATAL => 'all', NONFATAL => 'exec';
両方を行う!常に!