北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

use base でファイルが存在しないものを親にする

ラクダ本読んで初めて知りました。

use base は $VERSION を見てrequireするかを決めている

% perl -e 'use base "hoge";'
Base class package "hoge" is empty.
    (Perhaps you need to 'use' the module which defines that package first.) at -e line 1BEGIN failed--compilation aborted at -e line 1.

ですが、

% perl -e '$hoge::VERSION = 1; use base "hoge";'
% 

です。

use base は$VERSION を勝手にセットする

# Super.pm
package Super;
1;

# test.pl
print "Before use base: ", $Super::VERSION, "?n";
eval qq/ use base 'Super'; /;
print "After  use base: ", $Super::VERSION, "?n";

# [実行結果]
# % perl test.pl
# Before use base:
# After  use base: -1, set by base.pm


まとめると、use base でファイルが存在しないクラスを親にしたい場合は、事前に $VERSION変数 をセットしておくと吉です。

2010-03-22 追記

"... is empty." なエラーを出す前に base.pm は %{"$base\::"} も覗いていますので、$VERSION に限らず名前空間に何らかのシンボルさえ置いていればエラーにはならないです。ただし、 $VERSION で require をかけに行くかを判定しているのは事実なので、定義しておいた方がベターです。

以上、 base-2.14 で確認。