-3

私は perl を学習し、それが進むにつれて働いている新しい男です。私はこの時点で本当に立ち往生しており、過去4時間このことに取り組んできましたが、結果はありません.

ディレクトリ内で一連のカスタム モジュールを使用していますが、新しい KnowledgeBase を実装するためのチケットを取得したため、Moduledirectory に新しいモジュールを追加しました。追加した後、MyModule にアクセスしようとすると、まったく機能しません。私は得る

Can't locate FolderName/MyModuleName.pm in @INC 

誰か助けてください。それは本当に迷惑になっています。Apache サーバーを再起動しようとしましたが、それでも同じエラーが表示されます。

また、モジュールをコンパイルしようとしましたが、モジュールの名前が異なることを除いて同じエラーが発生します。これは、MyModuleで呼び出し/使用しているものです。

あなたが私を助けることができるかどうか私に知らせてください. 前もって感謝します。

編集:詳細を追加すると、正確なエラー(読みやすくするために改行あり)は次のとおりです。

Can't locate Net2Net/KnowledgeBase.pm in @INC (@INC contains:
    (DOCUMENT_ROOT)/bin 
    /usr/local/lib/perl5/5.8.8/sun4-solaris
    /usr/local/lib/perl5/5.8.8
    /usr/local/lib/perl5/site_perl/5.8.8/sun4-solaris
    /usr/local/lib/perl5/site_perl/5.8.8
    /usr/local/lib/perl5/site_perl
    .
) at /data1/web/intradev.com-80/docs/gss/kb/ajax-kb-update.cgi line 6.
BEGIN failed--compilation aborted at /data1/web/intradev.com-80/docs/gss/kb/ajax-kb-update.cgi line 6.
4

2 に答える 2

7

エラーメッセージはそれをすべて言います...

カスタム モジュールはどこにインストールされていますか?

@INCPerl は、 Perl モジュールを検索するためにディレクトリを追跡するために呼び出される配列を使用します。コマンド ラインで入力すると、デフォルトのディレクトリperl -Vリストが表示されます。@INCリスト内のいずれかのディレクトリにモジュールを配置できます@INCuse lib;@INCを使用してディレクトリを追加することもできます。プラグマ。これは、Perl ソース コードに含まれている必要があります。

ほとんどの@INCリストには現在のディレクトリが含まれているため、通常はそこにモジュールを貼り付けることができます。しかし、Apache または perl_mod で CGI スクリプトとして実行されていますか? 最善の方法は、use Cwd を使用することです。モジュールを使用して、現在のディレクトリが何であるかを確認します。CGI は、セキュリティ対策として特定の環境変数を削除している可能性があります。

もう一つ。Perl モジュールが の場合、Foo::Barモジュールはディレクトリ リストFoo/Bar.pmの下のいずれかのディレクトリの下にあり@INCます。の場合Foo::Bar::Foomは、モジュールを参照していますFoo/Bar/Foom.pm。一部の人々は、ディレクトリなしでモジュールを単にコピーします。

于 2012-09-25T02:09:22.280 に答える
1

ファイルは次の場所にあります。

/data1/web/intradev.com-80/docs/bin/Net2Net/KnowledgeBase.pm 

しかし、Perl は次の場所を検索します (cwd が であると仮定すると/、これは apache での CGI の可能性が高いです):

/(DOCUMENT_ROOT)/bin/Net2Net/KnowledgeBase.pm 
/usr/local/lib/perl5/5.8.8/sun4-solaris/Net2Net/KnowledgeBase.pm 
/usr/local/lib/perl5/5.8.8/Net2Net/KnowledgeBase.pm 
/usr/local/lib/perl5/site_perl/5.8.8/sun4-solaris/Net2Net/KnowledgeBase.pm 
/usr/local/lib/perl5/site_perl/5.8.8/Net2Net/KnowledgeBase.pm 
/usr/local/lib/perl5/site_perl/Net2Net/KnowledgeBase.pm 
/Net2Net/KnowledgeBase.pm

そのため、Perl はそれを見つけることができません。あなたはそれを見るように言わなければなりません

/data1/web/intradev.com-80/docs/bin

追加することでそれを行うことができます

use lib '/data1/web/intradev.com-80/docs/bin';

あなたに.cgi。(他の方法には、-Iコマンド ライン オプションと env varの使用が含まれます。 perlrunPERL5LIBを参照してください。) 誰かがそれ (または同等のもの) を実行しようとしたように見えますが、(同等のもの) を実行してめちゃくちゃになりました。

use lib '(DOCUMENT_ROOT)/bin';   # Wrong!

相対パスを使用する場合は、次も機能します。

use Cwd            qw( realpath );
use File::Basename qw( dirname );

use lib dirname(realpath($0)).'/../../bin';
于 2012-09-25T18:26:49.360 に答える