#navi_header|Perl| * 外部パッケージの未定義関数呼び出しはどういうエラーになるか。 JavaはC++はコンパイル時にinterfaceをチェックしてくれる。しかし、実行時にコンパイルされるPerlやPHPなどのスクリプティング言語の場合、interfaceが実装されていることの確認も実行時である。そのため、特に動的なローディングを用いている場合、本当にinterface、Perlの場合はサブルーチンが実装されているのか。実装されていない場合、どういう状況になるのかを前もって確認しておきたい。 - コードピース -- test03.pl #!/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"; -- Hoge/Moge.pm (空っぽのパッケージ) 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パッケージには適用できない」とか書いてあって、一歩引いてしまう。 まあ、いくらコンパイル時にチェックできても、結局はそれも実行時ではあるので((Perlには事前コンパイルされたバイナリをそのまま直接実行できる機構はあるのだろうか?当然、知らないだけで、あるに違いない。))、まあ、これは '' しょうがないので諦める '' というのも一つの手である。 ・・・これ、%SIG{DIE}で拾えないのかなあ?try-catchの実験の時に、リベンジしてみよう。 #navi_footer|Perl|