13

変数の宣言を避けるために is off を保持する難読化されたゴルフ コードを見たことがあります。また、コマンド ラインで -e スイッチを使用してそれらをスキップし、ワンライナーを短くしていることがわかります。本番コードで使用したくない、および/または使用したくないケースは何ですか? use strictuse warningsそれらを使用したくない理由は何ですか?

ここで、経験豊富な Perl ユーザーが Perl を初めて使用する人に常にPerl を使用するように指示している投稿を見たので、質問が出てきました。

ここで関連する質問をいくつか見つけましたが、それらをオフにしておく必要がある場合について説明していません。

4

3 に答える 3

9

に違反するシンボルテーブルで特定の操作を行ったり、トリガーされるサブルーチンを再定義したりするなど、やりたいことを実行できないことがありstrictます。それ以外の場合は、特定の警告に対して防御的なコードを記述するよりも無視する方が便利です。たとえば、.warningsstrict 'refs'warnings 'redefine'NULL/undefwarnings 'uninitialized'

use strictおよびuse warningsそれらの難燃剤はローカルにスコープno strictを設定できるため、最小の実用的な範囲でno warnings無効にすることをお勧めしstrictます。warnings

@data = get_some_data_from_database();
if (some_condition()) {
    no warnings 'uninitialized';
    logger->debug("database contains: @$_") for @data;

    ## otherwise, suppressing the warnings would take something
    ## less readable and more error-prone like:
    #  logger->debug("database contains: @{[map{defined?$_:''}@$_]}") for @data
    #  logger->debug("database contains: @{[map{$_//''}@$_]}") for @data
}
# end of scope, warnings `uninitialized' is enabled again
于 2013-08-05T18:15:37.033 に答える
4

Perl が何をしているかを正確に理解するのに役立ちますuse strictuse warnings

Perl が何をしているのか、そしてその理由を常に理解している人(つまり、ほとんど誰もいない) は、スペースとおそらく実行時間を節約するために、それらを省略する資格があります。残念ながら、スペースと時間を節約したいと考えている人々の多くは、 Perl が何をなぜ行っているのかを正確に理解していない人々であり、Perl が何をしているのかについての彼らの理解は、他の言語から学んだ非常に多くの誤った仮定に基づいています。それらを省略することは絶対に許されるべきではありません。

他にもいくつかの正当な理由があります。

  • すでに完全に認識している警告を生成する動作を試す (たとえば、多くの再帰)
  • 古いパッケージを使用する (ただし、2000 年 7 月頃以降に作成された私のパッケージはいずれも、use strictまたはuse warningsでメッセージを生成しません。したがって、ここでの「古い」は、Perl バージョン 4 以前のように、本当に、本当に古いことを意味します)
  • 誰も期待しないような魔法のような Perl の動作を利用したい場合 (ただし、あなたは専門家だから当然のことですが)、そのための警告の代償を払いたくない場合。

ところで、任意の入力を受け入れ、その入力に基づいてアクションを実行するプログラムの場合、-Tフラグを使用して、ユーザー入力から取得した汚染された可能性のあるデータの使用を追跡することも非常に重要です。

更新: @mob は、いくつかの調査が必要なコメントで主張しています。つまり、strict と warnings を使用しないことは、平均的な意味のないマイクロ最適化よりも低いマイクロ最適化です。以下のすべてのケースで、strict と warnings を使用しない場合のリアルタイムは 12 ミリ秒であり、以下のすべてのケースで、それらを使用する場合のリアルタイムは 57 ミリ秒以上です。

したがって、最初に述べたように、実行時間にメリットがある可能性があります (これは、テンプレート内に Perl スクリプトを埋め込み、Web ページが読み込まれるたびに一度に 10 または 20 個のスクリプトを実行するようなことをしている場合にのみ問題になります。例)、しかし、Perl が何をなぜ行っているのかを常に正確に把握していない限り、それらを使用することをお勧めしますこのカテゴリの「専門家」についての私の説明は、空のセットに非常に近いことを意図しています。あなたがこのカテゴリーに当てはまると思うなら、あなたは自動的にそうではありません。

[j@5 ~]$ time perl -e '1;'

real    0m0.012s
user    0m0.005s
sys     0m0.007s
[j@5 ~]$ time perl -e '1;'

real    0m0.012s
user    0m0.010s
sys     0m0.005s
[j@5 ~]$ time perl -e '1;'

real    0m0.012s
user    0m0.011s
sys     0m0.001s
[j@5 ~]$ time perl -e '1;'

real    0m0.012s
user    0m0.004s
sys     0m0.007s
[j@5 ~]$ time perl -e '1;'

real    0m0.012s
user    0m0.005s
sys     0m0.007s
[j@5 ~]$ time perl -e 'use strict; use warnings;'

real    0m0.058s
user    0m0.058s
sys     0m0.000s
[j@5 ~]$ time perl -e 'use strict; use warnings;'

real    0m0.057s
user    0m0.041s
sys     0m0.016s
[j@5 ~]$ time perl -e 'use strict; use warnings;'

real    0m0.057s
user    0m0.033s
sys     0m0.025s
[j@5 ~]$ time perl -e 'use strict; use warnings;'

real    0m0.057s
user    0m0.050s
sys     0m0.009s
于 2013-08-05T17:58:20.220 に答える