home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

Perl/codepiece/interface01

Perl/codepiece/interface01

Perl / codepiece / interface01
id: 132 所有者: msakamoto-sf    作成日: 2007-03-16 22:54:40
カテゴリ: 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パッケージには適用できない」とか書いてあって、一歩引いてしまう。

まあ、いくらコンパイル時にチェックできても、結局はそれも実行時ではあるので*1、まあ、これは しょうがないので諦める というのも一つの手である。
・・・これ、%SIG{DIE}で拾えないのかなあ?try-catchの実験の時に、リベンジしてみよう。


*1: Perlには事前コンパイルされたバイナリをそのまま直接実行できる機構はあるのだろうか?当然、知らないだけで、あるに違いない。

プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2008-12-28 22:56:15
md5:898f1d0d3f48ef78b9fdb6877758c4e4
sha1:d7c70dc0a07567113cca4e34037f239db31601fe
コメント
コメントを投稿するにはログインして下さい。