プロが教えるわが家の防犯対策術!

ホスティングを使用しています。
plファイルについて、以前のサーバはちゃんと動作していましたが、
新しいサーバで、jcode.plが読み込めないらしくInternal Server Errorが出てしまっています。

階層は
httpdocs--test.pl
|--cmn--jcode.pl

にしています。
ログを見ると
[error] Can't locate cmn/jcode.pl in @INC
17行目部分、つまりrequire 'cmn/jcode.pl';があるところがエラーになってます。

以前は読み込めているのに、新しいサーバでは読み込めていない。

ちなみに
・パーミッションはちゃんと変更していますtext.pl[755]
・httpdocs自体は.htaccessでpl自体は動作できています
つまり、 require行を外すとページはきちんと表示されます。

となると考えられる原因はなんでしょうか?
そして対策方法を教えて頂ければと思います。

よろしくお願いいたします。

A 回答 (3件)

本体のスクリプトのファイル名が main.cgi だとしてそこと同じ


ディレクトリに index.cgi というファイル名で以下のような
スクリプトを書いてください。

#!/usr/bin/perl
# ↑Perl のディレクトリ
# wrapper
use strict;
use CGI::Carp qw(fatalsToBrowser);
use File::Spec;
use File::Basename;
use Cwd;

# カレントディレクトリの設定
my $fn = File::Spec->rel2abs(__FILE__);
$fn =~ s/\\/\//g;
my ($dir) = (fileparse($fn))[1];
chdir $dir if(getcwd() ne $dir);

# main.cgi を読み込む
require './main.cgi';
exit;

そして、すべてのリクエストを index.cgi に対して行うように
するとスクリプトのあるディレクトリがカレントディレクトリになり
ます。
ただし、すべての環境で動作するかどうかは分かりません。
    • good
    • 0

調べればわかるんだけど, @INC は「require や use するファイルを探すディレクトリ」のリストです. この場合,


require 'cmn/jcode.pl';
を実行すると
/usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi/cmn/jcode.pl,
/usr/lib/perl5/5.8.5/cmn/jcode.pl,...
を順に探し, 一番最初に見つかったファイルを読み込みます. そして, そのようなファイルが見つからなければ
Can't locate cmn/jcode.pl in @INC
というエラーになります.
なお, @INC の中の「.」は「スクリプトのあるディレクトリ」ではなく「スクリプトを実行するときのディレクトリ」です. だから, これは「スクリプトのあるディレクトリ」を指すとは限りません. 念のため.

この回答への補足

それで具体的にどうすればいいのかな
#!/usr/bin/perlパスはついているし
その下に
#!/usr/lib/perl5/5.8.5/

とかパスを書き足しても解決できないのですが

補足日時:2008/12/25 15:30
    • good
    • 0

「考えられる原因」も何も, エラーメッセージがすべてだと思う.


@INC の値はどうなってますか?

この回答への補足

(@INC contains:
/usr/lib64/perl5/5.8.5/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.5
/usr/lib64/perl5/site_perl/5.8.5/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.4/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.3/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.2/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.1/x86_64-linux-thread-multi
/usr/lib64/perl5/site_perl/5.8.0/x86_64-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/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.4/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.3/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.2/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.1/x86_64-linux-thread-multi
/usr/lib64/perl5/vendor_perl/5.8.0/x86_64-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
. /etc/httpd/
/etc/httpd/lib/perl)

実は@INCというのが何のことなのかもよくわかりません。
これで何が分かるのでしょうか?

追記
上の階層がずれていましたがcmnは
httpdocs/cmn/jcode.plです。

補足日時:2008/12/22 11:24
    • good
    • 0

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


このQ&Aを見た人がよく見るQ&A