こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

@INCにセットされたディレクトリとはどういう意味ですか?

中島さんのXPDFJ(http://hp1.jonex.ne.jp/~nakajima.yasushi/)を利用してPDFファイルの生成を試みています。

分らないことだらけではあるのですが、試行錯誤しながらやっておりまして、cgiファイルでいろんな操作をしている中の1つにPDFファイルの作成ができるように、次のように書き、perlチェックをしてみたところその下の内容のエラーが表示されました。

書いた内容
$outfile = "○○.pdf";
$xmlfile = "○○.xml";
use XPDFJ;
$xpdfj = new XPDFJ;
$xpdfj->parsefile($xmlfile, outfile => $outfile);

出てきたエラー内容
Can't locate XPDFJ.pm in @INC (@INC contains: /usr/lib/perl5/5.8.5/i386-linux-thread-multi /usr/lib/perl5/5.8.5 /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl/5.8.2 /usr/lib/perl5/site_perl/5.8.1 /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl/5.8.2 /usr/lib/perl5/vendor_perl/5.8.1 /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at ○○.cgi line 2760.
BEGIN failed--compilation aborted at ○○.cgi line 2760.


readme.txtを読むと「PDFJを構成する次のモジュールファイル群をPerlから利用できる(すなわち@INCにセットされた)ディレクトリにおけば利用できる」とあるのですが、この@INCにセットされたディレクトリとはどこのことを言っているのでしょうか。
レンタルサーバー(専用サーバーではありません)では扱えない領域なのでしょうか。

投稿日時 - 2009-07-29 18:37:30

QNo.5165785

すぐに回答ほしいです

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

@INCはuseあるいはrequireした時にそのモジュールが探されるディレクトリのリストです。
@INC自体はただの配列なのでpushなどでディレクトリを指定できます。

BEGIN {
push @INC, './lib';
}
# ./lib/XPDFJ.pmがあればエラーは表示されないはず
use XPDFJ;


ちなみにBEGIN { ... }というのは

use XPDFJ;

の前に

push @INC, './lib';

を実行するために必要です。
Perlはコンパイルフェーズ(構文チェックやモジュール読み込みなど)と実際の実行フェーズがあり、

use XPDFJ;

はコンパイルフェーズに行われるので普通に

push @INC, './lib';
use XPDFJ;

と書いたのではuse XPDFJの方が先に実行されてしまうからです。
BEGIN {}の中に記述することでコンパイルフェーズにその中の文が実行されます。

投稿日時 - 2009-07-29 19:47:30

お礼

大変分かり易い解説ありがとうございました。
最初相対パスでやっていてうまくいきませんでしたが、フルパスで指定してみたらエラーチェックではOKと出て、まず最初の関所をクリアすることができました。
今は実行してみたら実際にはInternal Server Errorとなりファイルが生成されないことで悩んでます。
まだまだ完成まで遠そうですが、初めてのことで非常に悩んだ場所でしたので、かなり前進しました。
ありがとうございました。

投稿日時 - 2009-07-30 09:26:49

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

INCはモジュールを検索するパスのようなものです。

> この@INCにセットされたディレクトリとはどこのことを言っているのでしょうか。

エラーメッセージに書かれているとおりです。すなわち、

/usr/lib/perl5/5.8.5/i386-linux-thread-multi
/usr/lib/perl5/5.8.5
/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi
.......

デフォルトの値はperlがインストールされているディレクトリなどの情報をベースに決定され、通常は一般ユーザへのパーミッションがないディレクトリのみです。

INC 変数の値に要素を追加したり、環境変数PERL5LIBを設定することで後から追加したりすることもできたはずです。

あと、use lib を使うときに絶対パスを書くことでも対処できます。(セキュリティ的にはベスト)

投稿日時 - 2009-07-30 08:45:26

あなたにオススメの質問