第22回 実行する前にわかるエラーと実行時にわかるエラー

前回、 シングルクォートで囲った中身に、シングルクォートを書くとエラーになるといった話題を扱ってきたので、今回は、表題の通りの話題でいきたいと思います。



bingo.pl というファイル名で書いたperlを実行するなら、次のようにすれば実行できるであろう。

$ perl bingo.pl


実行する前に -w を付ければ、「警告」を、 -c を付ければ、構文をチェックしてくれる

$ perl -wc bingo.pl 
bingo.pl syntax OK

-w と -c に関する説明は、

$ perl -help

とすれば、

(略)
-c              check syntax only (runs BEGIN and CHECK blocks)
(略)
-w              enable many useful warnings (RECOMMENDED)

と書かれている箇所を発見できるはずである。

次のソースを考えてみる

以下のようなソースを用意してみよう。

use strict;

sub hoge{
  my $c = shift;

  # 受け取ったもの(引数)は、配列へのリファレンスとして処理
  for( @$c ){
    print "$_", "\n";
  }
}

print "開始\n";

my @d = 0..3;
hoge(\@d);

print "終了\n";

perl -wc

$ perl -wc bingo.pl 
bingo.pl syntax OK

実行

$ perl bingo.pl 
開始
0
1
2
3
終了

問題はない。

それでは、つぎのように変えてみる

渡す引数を、スカラー変数にしてみる。

use strict;

sub hoge{
  my $c = shift;

  # 受け取ったもの(引数)は、配列へのリファレンスとして処理
  for( @$c ){
    print "$_", "\n";
  }
}

print "開始\n";

my $d = 3;  # スカラーに変更
hoge(\$d);

print "終了\n";

perl -wc

$ perl -wc bingo.pl 
bingo.pl syntax OK

実行

$ perl bingo.pl 
開始
Not an ARRAY reference at bingo.pl line 7.

このように、スカラーを配列とみなそうとしたので、
処理が途中まで行われ、エラー箇所でストップしてしまった。



hoge関数自体には、文法上エラーは存在しないのである。
hoge関数が受け取るものがなんなのかは、実行しない限りはわからない。



しかし、多くのエラーは、perlを実行する前に、

perl -wc

とすることで見つけることが可能である。


それでは また〜


(※ お恥ずかしながら、今回の件に関しては、多くを語れるほど(まとめて説明できるほど)の知識を今の私は持っておりません(他言語も含め)。 どこか詳しいページなどをご存知の方がいらっしゃれば教えてくださるとうれしいです(型に関する話になっていくのでしょうか?)。