dポイントプレゼントキャンペーン実施中!

現在、Webサーバが古くなったため、新しいWebサーバにアプリケーションを移行しようとしています。PerlもPostgreSQLもインストールし、プログラムを実行するのですが、以下のエラーメッセージが表示されます。
エラーメッセージ表示:
Can't locate Pg.pm in @INC (@INC contains: /usr/lib/perl5/5.8.5/i386-linux-thread-multi
(中略)BEGIN failed--compilation aborted at mgdbrest.pl line 37.
でエラーになってしまいます。
環境:
パッケージのインストール確認をすると問題なく、Pg.pmパッケージもインストール済みです。またPg.pmファイルも存在します。
またperl -Vコマンド実行でも@INCも表示されます。

OS: MiracleLinux4.0
%rpm -qaの結果
perl-DBD-Pg-1.31-6.1AX
postgresql-libs-8.0.8-1.2AX
postgresql-pl-8.0.8-1.2AX

%Pg.pmファイルの登録状況
/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBD/Pg.pm

%perl -Vの結果(一部抜粋)
Characteristics of this binary (from libperl):
Compile-time options: DEBUGGING MULTIPLICITY USE_ITHREADS USE_LARGE_FILES PERL_IMPLICIT_CONTEXT
Built under linux
Compiled at Aug 23 2006 01:53:27
@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

質問:
対処方法を御存知の方がみえたら教えてください。やはり再インストールしなければならないのでしょうか。

A 回答 (3件)

use Pg; していませんか。

perl と postgresql のインタフェースには、DBI を使う DBD::Pg と PostgreSQL ネイティブインタフェースの Pg とがあります。Pg は、PostgreSQL 7.3? くらいから別配布となり、http://gborg.postgresql.org/ から Pg-2.1.1.tar.gz が入手できたのですが、http://pgfoundry.org/projects/pgperl/ に移動したようです。しかしこのプロジェクトページには何も登録されていません。CPAN には、http://search.cpan.org/~mergl/pgsql_perl5-1.9.0/ が登録されていますが、古そうです。

どうしてなくなったのか分かりませんが、DBD::Pg を使って書き直すか、Pg-2.1.1.tar.gz を他の場所から探し出すしかないでしょう。
    • good
    • 0
この回答へのお礼

御礼が遅くなり、申し訳ありません。
Pg-2.1.1.tar.gzを入手しインストールしたところ、無事問題が解決できました。本当にどうもありがとうございました。
助かりました。

お礼日時:2008/01/28 16:59

確認ですが, perl -V で表示される @INC には


/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBD
は入っていないわけですね?
だとすると, push のタイミングの問題になると思います. use はスクリプトのコンパイル時に処理するのに対し push はそのままでは実行時に処理しますから, 単純に「文面上 push が use より前にあればよい」というものではありません.
Pg.pm を use する前に @INC に push しないといけませんから,
1.use lib を使う
2.push を BEGIN ブロックに入れる (BEGIN { push(@INC, ...); } のように)
のいずれかでしょう.
    • good
    • 0

@INC のどのディレクトリにも Pg.pm がないからじゃないですか?


Pg.pm の絶対パスをよ~く見ると, vendor_perl というディレクトリがはさまってますね.

この回答への補足

早速、回答をいただき、ありがとうございます。
すみません。@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
 (中略)
  /usr/lib/perl5/site_perl/5.8.5
(中略)
/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.0/i386-linux-thread-multi
(中略)
/usr/lib/perl5/vendor_perl/5.8.0
/usr/lib/perl5/vendor_perl
.
になっています。
プログラムの中でもpush (@INC, "/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/DBD/");と記載しています。
対処方法はありますか。

補足日時:2008/01/16 23:09
    • good
    • 0

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