Home > Perl > FindBin module を使って use lib 記述をシンプルにする

FindBin module を使って use lib 記述をシンプルにする

  • 2005-08-24 (水)
  • Perl
  • このエントリーを含むはてなブックマーク

下記のようなディレクトリ構成の Perl コードがあった場合、

/root/www/cgi-bin/fuga.cgi
/root/www/lib/*.pm
/root/www/lib/*/*.pm

CGIスクリプトの冒頭で /root/www/lib 下を use lib する記述を書きますが、僕は今まで

use lib '/root/www/lib';

と、おもむろにフルパスで書いておくものの、後でリソース全部を /root/newdir なんかに移動させたあげく、use lib 記述を修正するの忘れた状態で Can't locate *.pm in @INC なんて怒られて「何故?」と途方にくれてみたり、

BEGIN {
    # シンボリックリンクを解決
    $::path = (-l $0) ? readlink($0) : $0; 
    # スクリプト名部分を除去
    $::path =~ s!/[^/]+$!!;
}
use lib "$::path/../lib";

なんて BEGIN 句の中でゴリゴリと実行パスを取得してみたりしてましたが(後者は同期 uedak 氏に教えてもらったやり方)、Perl の Core Module である FindBin module を使えばもっとスマートに同処理を書ける事を発見。FindBin を使ったらこんな風に書けました:

use FindBin;
use lib "$FindBin::RealBin/../lib";

以上。感動。

FindBin module には BEGIN 句の中で実行パス/ファイル名を取得してそれぞれを $FindBin::Bin, $FindBin::Script 変数に格納するコードが書かれています。なので、use FindBin と記述しておけば、後述コード中でいつでも実行パスが取得可能になる、と。ちなみに $FindBin::Bin と $FindBin::RealBin の違いは symbolic link 等のパス解決をするかしないかの違いです。詳しくは perldoc 等を参照って事で。

CPAN を調べてみたところ、FindBin module は perl5.003_07 の頃から Core Module として組み込まれていましたので、実行環境や Perl のバージョンを気にする事無く安心して使えそうです。

Comments:0

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

Remember personal info

Home > Perl > FindBin module を使って use lib 記述をシンプルにする

Search
Feeds

Page Top