JavaはC++はコンパイル時にinterfaceをチェックしてくれる。しかし、実行時にコンパイルされるPerlやPHPなどのスクリプティング言語の場合、interfaceが実装されていることの確認も実行時である。そのため、特に動的なローディングを用いている場合、本当にinterface、Perlの場合はサブルーチンが実装されているのか。実装されていない場合、どういう状況になるのかを前もって確認しておきたい。
#!/usr/bin/perl use strict; use warnings; use File::Basename; BEGIN { my (undef, $__base_dir, undef) = fileparse($0); push(@INC, $__base_dir); } use Hoge::Moge; print __PACKAGE__, " - 1\n"; &Hoge::Moge::moge(); print __PACKAGE__, " - 2\n";
package Hoge::Moge; use strict; use warnings; 1; __END__
$ perl -c ./test03.pl test03.pl syntax OK
$ ./test03.pl main - 1 Undefined subroutine &Hoge::Moge::moge called at test03.pl line 16.
このように、やはりコンパイル時はチェックされず、実行時に初めてチェックされ、エラーとなることが確認できた。
use interface (http://search.cpan.org/~swalters/interface-0.02/interface.pm)を使用すれば、コンパイル時にもチェックできるらしいが、BUGSには「Damian Conwayの書いたコードの殆どで動かない」とか、「mainパッケージには適用できない」とか書いてあって、一歩引いてしまう。
まあ、いくらコンパイル時にチェックできても、結局はそれも実行時ではあるので(*1)、まあ、これは しょうがないので諦める というのも一つの手である。
・・・これ、%SIG{DIE}で拾えないのかなあ?try-catchの実験の時に、リベンジしてみよう。