- 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 のバージョンを気にする事無く安心して使えそうです。
- Newer: flasm を使って FLASH の swf file に直接変更を加える
- Older: 理想の組織像 - こんな技術者集団でありたいな