• ベストアンサー

モジュールからの相対パス指定の方法

モジュールからの相対パス指定の方法 /index.cgi /lib/mymodule.pm /lib/mymodule.cfg のような構成の時、mymodule.pmからmymodule.cfgを相対パスにて読み込むことは可能ですか? mymodule.pmとmymodule.cfg間の相対パスは常に一定だけれど、 index.cgiから、mymodule、mymodule.cfgの相対パスは変化するというような事を想定しています。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.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 でも取り込んだモジュールの パスを取得することができます。

参考URL:
http://kawa.at.webry.info/200906/article_4.html
nshoes
質問者

お礼

どうもありがとうございます。勉強になりました。 ------------ __FILE__ でモジュールのパスが取れるのを思い出したのであわせて記載しておきます。

その他の回答 (2)

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

モジュールやプラグマは読み込まれた時点で、そのスクリプトの一部をなすので、モジュール側で相対パスを指定することはないですし、そのようにモジュールを書いてはなりません。  そのため、質問内容が今一つ理解できないのですが??

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> mymodule.pmからmymodule.cfg 両方ディレクトリ(フォルダ)ですか? どちらもファイルなら同じディレクトリ(フォルダ)/libにあるようですが。 相対パスで可能です。 ../mymodule.cfg ..は親ディレクトリ(ひとつ上の階層)を指します。 mymodule.pmの親を指すので/libを指します。 自分でない別の子を指すので、兄弟の関係ですね。 ただし、「ディレクトリトラバーサル」というセキュリティ面の問題とを一読しておいてください。

nshoes
質問者

補足

ご回答ありがとうございます。 説明が足りなくてすいません。 /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" みたいにわざわざ書き直すことなく 動作させたいと考えています。

関連するQ&A