2013-02-13 5 views
5

.pmファイルを持っている場合は、@INCパスに配置することなく、useの方法がありますか?特定のユースケースでは、相対パスを使用するか、またはこのディレクトリを@INCに追加するよりも明確になります。Perlの使用/廃止パスが必要ですか?

編集:明確化:

私は@INC内のすべてのアイテムを反復処理し、代わりに私が興味を持っているファイルを直接指定する必要性を回避するために期待していた例えば、Node.jsの中で、require('something')意志を。パスのリストを検索しますが、require('/specific/something')は私がそれを指示する場所に直接行きます。

Perlでは、これはrequireと同じ機能であるとは確信していませんが、動作するようです。

ただし、useステートメントにはbarewordsが必要です。それが私に、絶対的な道に入る方法をちょっと困惑させてしまった。

+0

'module'のは、あなたのケースのために正しいだろう使用する前に、' lib'ステートメントを使用します。しかし、なぜあなたは 'require'を使うことができません。それはあなたの問題にさらに適しています。また、プロジェクトやアプリケーション全体にそのディレクトリを適用するために、Apacheのconf内の 'SetEnv PERL5LIB'環境変数を使用することもできます。 –

+0

私は '.pm'ファイルが必要です。私は試していないが、正しく動作するようには見えない。私は通常 'CGI :: ReadParse();'や 'use CGI ':cgi';'のような構文でモジュール内の関数を呼び出します。私は '.pm'ファイルのために' require'を使ってどうすればいいのか分かりませんが、 'require'を使ってそれを行うことができれば、私の問題は本当に解決されます。 –

+0

それは動作します。この 'require 'Newmodule :: pm"; 'のようにしてから、' Newmodule :: subname(); 'を呼び出してください。それは正常に実行されます。 –

答えて

4

コメントで議論したとおり、requireを使用することをお勧めします。また

require "pathto/module/Newmodule.pm"; 

Newmodule::firstSub(); 

、以下のようにあなたは、すべてあなたがモジュールを使用したいファイルに次の行を追加する必要が

  • use lib 'pathto/module';以下のように他のオプションを使用することができます。

lib 'pathto/module'を使用します。
使用Newmodule; PERL5LIB環境変数を使用して

  • 。エクスポートを使用してコマンドラインでこれを設定するか、すべてで、それはあなたの@INCに追加されますログインよう~/.bashrcにこれを追加します。 PERL5LIBはすべての@INCディレクトリの前にディレクトリを追加することを忘れないでください。だから最初に使用されます。また、あなたは

    SetEnv PERL5LIB /fullpath/to/module 
    
  • またはBEGINブロックでそれを設定を使用してApacheのhttpd.confにそれを設定することができます。

4

あなたはこれを使用することができます:

use lib '/path/to/Perl_module_dir'; # can be both relative or absolute 
use my_own_lib; 

を自分で@INCを変更することができます(一時的に、心配は、それがuse libがあまりにも何ません):あなたがModule::Loadモジュールを使用することができます

BEGIN{ @INC = ('/path/to/Perl_module_dir', @INC); } # relative or absolute too 
use my_own_lib; 
+0

後者は '使用lib'ではなく、必ず自分自身のモジュールが同じ名前の他に何も前にピックアップされていることを確認するためにpop''の 'unshift'を使用することを除いて、何に非常によく似ています。 – Borodin

+0

POSTは、配列の先頭にプッシュするように編集されます。 –

+2

あなたのプログラムと同じディレクトリにモジュールを置くことは、それが作業ディレクトリであればうまく動作します。 '。 != dirname 'デフォルトで... – pavel

0

use Module::Load; 
load 'path/to/module.pm'; 
+0

を使用する必要があります。また、シンボルをインポートする手段も提供していないので、BEGINブロックの 'import'への呼び出しを追加する必要があります。 OPが何をしたいのかは、全体としては貧弱な解決策です。 – ikegami

0

FindBin::libsトリック:

# search up $FindBin::Bin looking for ./lib directories 
# and "use lib" them. 

use FindBin::libs; 
+0

それはFindBinを使用しています:: LIBSは$ FindBin使用しています。代わりに$ FindBinのビン:スクリプトへのシンボリックリンクを使用している場合、それは動作しませんので、RealBinを:( – ikegami

1

一般的に言えば、PERL5LIB環境変数を設定します。

export PERL5LIB=/home/ikegami/perl/lib 

見つけるためのモジュールは、スクリプトの相対ディレクトリにインストールされることを意図されている場合は、次のようにします。

use FindBin qw($RealBin); 
use lib $RealBin; 
    # or 
use lib "$RealBin/lib"; 
    # or 
use lib "$RealBin/../lib"; 

これは正しくスクリプトへのシンボリックリンクを処理します。

$ mkdir t 

$ cat >t/a.pl 
use FindBin qw($RealBin); 
use lib $RealBin; 
use Module; 

$ cat >t/Module.pm 
package Module; 
print "Module loaded\n"; 
1; 

$ ln -s t/a.pl 

$ perl a.pl 
Module loaded 
関連する問題