【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

中島さんの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にセットされたディレクトリとはどこのことを言っているのでしょうか。
レンタルサーバー(専用サーバーではありません)では扱えない領域なのでしょうか。

A 回答 (2件)

@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 {}の中に記述することでコンパイルフェーズにその中の文が実行されます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/30 09:26

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 を使うときに絶対パスを書くことでも対処できます。(セキュリティ的にはベスト)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!