- ベストアンサー
モジュールからの相対パス指定の方法
モジュールからの相対パス指定の方法 /index.cgi /lib/mymodule.pm /lib/mymodule.cfg のような構成の時、mymodule.pmからmymodule.cfgを相対パスにて読み込むことは可能ですか? mymodule.pmとmymodule.cfg間の相対パスは常に一定だけれど、 index.cgiから、mymodule、mymodule.cfgの相対パスは変化するというような事を想定しています。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
例えば use lib qw(lib); use mymodule; で取り込まれたファイルのパスは、 $INC{ "mymodule.pm" } に "lib/mymodule.pm" として保存されています。 なので、 mymodule.pm でこの値を取り出し、mymodule.pm を mymodule.cfg に 変えれば CGI プログラムから mymodule.pm と同じディレクトリに ある mymodule.cfg にアクセスすることができます。 CPAN モジュールの Class::Inspector でも取り込んだモジュールの パスを取得することができます。
その他の回答 (2)
- ORUKA1951
- ベストアンサー率45% (5062/11036)
モジュールやプラグマは読み込まれた時点で、そのスクリプトの一部をなすので、モジュール側で相対パスを指定することはないですし、そのようにモジュールを書いてはなりません。 そのため、質問内容が今一つ理解できないのですが??
- bin-chan
- ベストアンサー率33% (1403/4213)
> mymodule.pmからmymodule.cfg 両方ディレクトリ(フォルダ)ですか? どちらもファイルなら同じディレクトリ(フォルダ)/libにあるようですが。 相対パスで可能です。 ../mymodule.cfg ..は親ディレクトリ(ひとつ上の階層)を指します。 mymodule.pmの親を指すので/libを指します。 自分でない別の子を指すので、兄弟の関係ですね。 ただし、「ディレクトリトラバーサル」というセキュリティ面の問題とを一読しておいてください。
補足
ご回答ありがとうございます。 説明が足りなくてすいません。 /index.cgi /lib/mymodule.pm /lib/mymodule.cfg の構成のとき、 ■index.cgi use lib qw(./lib); use mymodule; my $app= mymodule->new(); ■mymodule.pm my $configfile = "./mymodule.cfg"; ←★(1) open(FH, $configfile); @data = <FH>; close(FH); ■mymodul.cfg 設定が記載 のような感じで、 ★(1) の場所 にて、mymodule.pm からの相対パスを指定したいのです。 (実行cgiファイルであるindex.cgiからの相対パスではなく) index.cgiからの相対パスがなんであれ、ソースの変更なしで、 mymodule.pmからmymodule.cfgを読めるようにしたいのです。 実行cgiはindex.cgiなので、index.cgiからのパスを指定すればこのプログラムは動きますが、 ($configfile = "./lib/mymodule.cfg"みたいに。) 例えば index.cgi /lib/modules/mymodule.pm /lib/modules/mymodule.cfg のような階層構造に変更した場合、mymodule.pmの内容を $configfile = "./lib/modules/mymodule.cfg" みたいにわざわざ書き直すことなく 動作させたいと考えています。
お礼
どうもありがとうございます。勉強になりました。 ------------ __FILE__ でモジュールのパスが取れるのを思い出したのであわせて記載しておきます。