
中島さんの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にセットされたディレクトリとはどこのことを言っているのでしょうか。
レンタルサーバー(専用サーバーではありません)では扱えない領域なのでしょうか。
No.1ベストアンサー
- 回答日時:
@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 {}の中に記述することでコンパイルフェーズにその中の文が実行されます。
大変分かり易い解説ありがとうございました。
最初相対パスでやっていてうまくいきませんでしたが、フルパスで指定してみたらエラーチェックではOKと出て、まず最初の関所をクリアすることができました。
今は実行してみたら実際にはInternal Server Errorとなりファイルが生成されないことで悩んでます。
まだまだ完成まで遠そうですが、初めてのことで非常に悩んだ場所でしたので、かなり前進しました。
ありがとうございました。
No.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 を使うときに絶対パスを書くことでも対処できます。(セキュリティ的にはベスト)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlのエラーについてご教授く...
-
perlについての質問
-
INDIRECT 横に再度抽出したい
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
検索ボックスから製品名を検索...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perl+DBD::Oracleのエラーがわ...
-
python
-
python 環境構築について
-
@INCにrequireされたファイルが...
-
use lib qw(変数名);は無理?
-
perl DBD::Pg インストールでエ...
-
Net::SSH::Perlについて
-
エラー内容がわかりません。Con...
-
Jcode.pmについて
-
英文でperlの文法などを説明し...
-
DBIをCPANからインストール時に...
-
DB_Fileモジュールインストール...
-
\\* の意味が分かりません。
-
SOAP::Liteを利用したい!
-
Pg.pmモジュールがロードできない
-
CygwinでPerlのCSV_XSを実行する
-
@INCにセットされたディレクト...
-
HTML::FillInFormが使えない(...
-
例外処理のフローチャートの記...
-
「デバイスは PRN を初期化でき...
おすすめ情報