について


今日は、use strict について勉強したいと思います。
use strictってのは、簡単に言うとプログラムのミスを防ぐ、見つけてくれる!って感じですかね?
use strictには3つの機能?があります。どのような機能かというと

  • use strict "vars"; #変数はあらかじめ宣言しなくてはならない
  • use strict "refs"; #シンボリックリファレンスは使えない
  • use strict "subs"; #裸のワードによる文字列はクォートしなければならない

以上の3つです。

多くのプログラミング言語では、コンパイラにヒントを与えることができます。Perlでは、このようなヒントは、use宣言を用いてコンパイラに伝えられます。これを、プラグマ(pragma)というらしいです。

なるほど、strictもプラグマの1つなんですね!

一部のプラグマはグローバル変数やカレントパッケージに影響を与えるグローバル宣言であるんですが、ほとんどのプラグマは、その効力が、取り囲むブロック、ファイルの末尾までに限定されているようなレキシカルスコープ宣言で、レキシカルスコープを持つプラグマの場合、内側のスコープでno宣言によって効力を打ち消すことができるらしいです。
なるほど、no宣言はちょうどuseの逆の動きをするものなんですね。

それでは話は戻って、use strictの機能を見ていってみましょう!

  • strict 'refs'

このrefsはシンボリックリファレンスを使うと、それが意図的であってもそうでなくても実行時エラーを発生させる。

use strict 'refs';

$ref = \$foo;		#リファレンスを格納する
print $$ref;		#デリファレンスしてもOK

$ref = "foo";		#グローバル(パッケージ)変数の名前を格納する
print $$ref;		#strict refsのもとでは実行時エラーになる

シンボリックリファレンスとは以下のようなものです。

$scalar = 'hoge';
$$scalar;              #これは「$hoge」と言う変数名を表す。

以上のように記述するだけで、perlはこれをシンボリックリファレンスと認識してしまいます。これは、間違ってしてしまいそうですね・・・。

  • strict 'vars'

次に示す基準に該当しない変数にアクセスすると、コンパイル時にエラーが発生する

Perlによってあらかじめ定義されている変数(@ARGV、%ENVなど)および記号の名前を持つすべてのグローバル変数($_など)
・ourで宣言されたもの(グローバル変数)、またはmyで宣言されたもの(レキシカル変数) 
・他のパッケージからインポートされたもの
・パッケージ名およびパッケージセパレータ::によって完全修飾されたもの

プログラム全体で有効なグローバル変数(@ARGVなどのように強制的にパッケージmainに登録されているもの)はエラーの対象にはならない。

この、strict 'vars'が適応されているときは、local宣言はエラーになる。localはただ実行時にそのブロックの範囲で有効な新しい一時的な値を与えるだけで、指定された変数がグローバルであるかどうか、という状態は変更しないからです。グローバル変数を宣言するにはourを使う必要があります。しかし、ourをlocal化することは可能。

local our $hoge;
  • strict 'subs'

このsubsは、裸のワードをすべて構文エラーとみなすようになる。文字列を表したい時はクォートで囲む。関数を呼び出したい時は、あらかじめ宣言しておくか、後ろに()をつけるようすると大丈夫みたいです。

 use strict 'subs';
 
 $hoge = hoge;		#エラー!! 裸のワード
 $hoge = 'hoge';		#OK
 $hoge = hoge();		#OK

 sub hoge;		#関数を前もって宣言しておく
 $hoge = hoge;		#これならOK

 %hash = (hoge => 1,ups => 2,);	#「=>」の左側が自動的にクォートされるためOK
 $hoge = $hoge{ups};		#ブレースによるクォート

 @array = @hash{"AAA","BBB"};  #OK
 @array = @hash{qx/AAA BBB/}   #OK

とまぁ、use strictの3つの機能をひと通り見ましたけど、こりゃ僕なんかはuse strictを使わないでプログラムを書いてしまうと・・・・。恐ろしいですね。
それでは、今日はこのへんで!