strict - 文法チェックを厳しくする



  1. Perl




  2. モジュール



  3. here

 文法チェックを厳しくするにはstrictモジュールを使用します。

use strict;

 strictプラグマはPerlの文法チェックを厳しくするためのプラグマです。strictプラグマは、Perlスクリプトを書くときには、必ず記述するようにしてください。宣言されていない変数が利用されていた場合は、スクリプトを実行しようとしたときに、コンパイルエラーで止まります。

strictプラグマの解説

 strictモジュールとは呼ばずに、strictプラグマと呼んでいますが、これはモジュールの一種で、Perlコンパイル時の挙動を変化させるものは、プラグマと呼ばれ、小文字で始める習慣になっています。

 strictプラグマの効果を見ていきましょう。strictプラグマには、みっつの効果があります。

変数宣言を強制する

 ひとつめは変数宣言を強制するという効果です。Perlではmyで宣言された変数はレキシカル変数と呼ばれます。strictプラグマを使用した場合は、宣言されていない変数を使用することができなくなります。

use strict;

# 変数を宣言して利用しているのでエラーにならない
my $num;
$num = 1
use strict;

# 宣言しないで利用しているのでエラーになる
$num2 = 2

 二番目のケースでは、以下のようなエラーメッセージが表示されて、プログラムは実行されずに、終了します。

Global symbol "$num2" requires explicit package name at a.pl line 4.

 英語で書かれているので翻訳します。

グローバルなシンボル「$num2」は明示的なパッケージ名を必要とします。4行目。

 このメッセージが表示されたら、宣言されていない変数が利用されていると考えて、ほぼ間違いはありません。行番号がわかるので、その行番号を見て、変数名に間違いがないか、事前に変数宣言をしているかをチェックしましょう。

クォートされていない文字列の文字列の禁止

 strictプラグマは、クォートされていない文字列の使用を禁止します。実はPerlでは、strictプラグマが有効になっていない場合は、クォートされていない文字列を使用することができます。strictプラグマを有効にした場合は、クォートされていない文字列を使用できなくなります。

use strict;

# 文字列をクォートしているのでエラーにならない
my $str = 'abcde';
use strict;

# 文字列をクォートしているのでエラーになる
my $str = abcde;

 二番目のケースでは、以下のようなエラーメッセージが表示されて、プログラムは実行されずに、終了します。

Bareword "abcde" not allowed while "strict subs" in use at a.pl line 3.

 英語で書かれているので翻訳します。

裸の「abcde」は「strict subs」の利用下では許可されていません。3行目。

このような間違いを避けるためにも、strictプラグマは必ず有効にしましょう。

シンボリックリファレンスの禁止

 三つ目の効果はシンボリックリファレンスの禁止です。Perlにはシンボリックリファレンスと呼ばれる機能がありますが、strictプラグマはシンボリックリファレンスの使用を禁止します。

 シンボリックリファレンスとは、間単にいうと文字列によって、シンボル(変数や関数)を参照できる機能のことです。

 以下のスクリプトを見てください。

# 足し算をする関数
sub total {
  my ($num1, $num2) = @_;
  
  return $num1 + $num2;
}

# シンボリックリファレンスで関数を参照して実行
my $num = &{'total'}(1 + 2);

print $num;

 このスクリプトではtatalという関数がありますが。「total(1 + 2)」とは呼び出さずに「&{'total'}(1 + 2)」として、シンボリックリファレンスで関数を参照して呼び出しています。

 strictプラグマが有効になっている場合は、次のようなエラーメッセージを表示してスクリプトは終了します。

Can't use string ("total") as a subroutine ref while "strict refs" in use at a.pl line 11.

 英語で書かれているので翻訳します。

「strict refs」の利用下では、文字列「total」をサブルーチンとして利用することはできません。11行目。

 ときには、シンボリックリファレンスを使用しなければならない場合が発生すると思います。動的にサブルーチンやメソッド名を決定したい場合などです。そういう場合は、次のようにして、シンボリックリファレンスの禁止を解除することができます。

use strict;

# シンボリックリファレンスの禁止だけを解除
no strict 'refs';

 このようにstrictプラグマには「変数宣言を強制する」「クォートされていない文字列の文字列の禁止」「シンボリックリファレンスの禁止」という三つの効果があることを、覚えておきましょう。