strict プラグマ

今までこの勉強日記に書いていたスクリプトには、strict プラグマを使っていませんでした。(プラグマ=use すると Perl の動作自体を変える事ができるモジュール)
短いコードばかりだったので、その必要もないかな、と思っていたのです……が、
iandeth. - Perl/CGI辞典 - 土井 毅さん 著 - にて use strict が推奨されていない件について

strict is your friend!!!!!
strict プラグマこそが、我々のミスを見つけてくれる、プログラマーの強力な味方です。「見通しの悪い複雑なスクリプト」を書いてしまう事への懸念は、すべてこの strict プラグマが晴らしてくれます。どんなにコードを書くときにも、かならずコードの先頭で、

use strict;

と書いておきましょう。

やはりどんなに短いコードでも use strict するべきなのですね。というわけで今後のぱるも日記では use strict を奨励していきます。(^_^)
strict プラグマを使うと、以下のような効果があります。

  • 宣言されていない変数が使えなくなる(use strict 'vars')
    • 全ての変数を「my」「our」「local」などで宣言するように強制する
      • (訂正) fbis さんのコメントによると「「local」はグローバル変数を局所化するだけのものなので「local $hoge」ってやってもstrictに怒られますよ。」との事です。確かにlocalは変数の局所化という意味でしたね。(^_^;)
    • スペルミスなどの typoコンパイル時にエラーになる
    • 変数がレキシカルかグローバルかわかりやすい
  • シンボリックリファレンスが使えなくなる(use strict 'refs')
    • 文字列をデリファレンスするだけでシンボリックリファレンス扱いになってしまうので、誤爆しやすい
    • シンボリックリファレンスは、その機能をよく理解していない限り使うべきではない
    • 「no strict 'refs'」で局所的に使えるようになる
  • 裸の文字列(bareword)が使えなくなる(use strict 'subs')
    • 裸の文字列とは頭に何も([$%@&*]が)ついていない識別子
    • その識別子がサブルーチンとして定義されていない場合は通常の文字列として扱われるが、それをエラーにする
    • サブルーチン呼び出しの typo を防ぐ

つまり、strict プラグマは「typo誤爆を防ぐ」効果があるモジュールです。気をつけていても typo はしてしまうものです。Perl の場合 typo してもコンパイル時にエラーにならないので、かなり厄介なバグになってしまいます。
ちょっとの制約を付ける事で typo のバグを防げるなら、そうするべきです。
ちなみに次期バージョンである Perl6 からは、最初から「use strict」されている状態になるそうです。