2009-08-18 8 views
5

私のアプリでは、すべてのモジュールを1つのディレクトリに入れました。それをlibxと呼んでいます。 アプリをどこに配備するかはユーザーが選択するので、libパスをハードコードしたくありません。"libを使用"しないのはなぜですか?

myapp.plの先頭に、私は次のコード行を書いていました。

#! /usr/bin/perl -w 
use strict; 

my $curr_dir = $0; 
my $curr_lib = $curr_dir; 
$curr_lib =~ s/myapp\.pl/libx/; 

use $curr_lib ; 

私が期待しているものを得るのではなく、エラーがコンパイルされています。

私のコードで何が問題になっていますか? use libを使用しているときにlibパスをハードコードしたくない場合、どうすればよいですか?


申し訳ありませんが、私はアプリが展開されるとき、myapp.pllibxが同じディレクトリにあることを言及するのを忘れてしまいました。

答えて

15

実行時ではなくコンパイル時に使用されるため、変数はまだ設定されていません。あなたは行うことができます :

my $curr_lib; 
BEGIN { 
    $curr_lib = $0; 
    $curr_lib =~ s/myapp\.pl/libx/; 
}  
use lib $curr_lib; 

かでした:

use FindBin; 
use lib "$FindBin::Bin/libx"; 
2

私も以前これに問題がありました。起こっているのは、Perlがコードを2回パスすることです。ひとつはコンパイルし、もう一度実行することです。あなたの例では、行4,5、および6は実行時まで実行されませんが、useはコンパイル時に有効になります。

1つの可能性は、すべてBEGIN{}ブロック内に配置することです。これにより、コンパイル時にコードが実行されます。私はこれをやったが、それは厄介で/醜い。 ($0の代わりに、Perlで$ARGV[0]を使用する必要があります)。

ライブラリをピックアップする場所をPerlに伝える最良の方法は、-Iフラグを使用することです。

ので、多分、
 
perl -I./libx script.pl 

を相対パスを使用することができますあなたは#!ラインにそれを置くことができ、または別のスクリプトからスクリプトを起動している場合、あなたは

 
perl -I/your/directory/libx your_script.pl 

あなたはとしてそれを開始することができますでしょうあなたのために働く。

+0

ユーザーがアプリを起動する方法を正確に教えていただければ役に立ちます。彼らは単に 'myapp'と入力しますか?pl 'であり、$ PATHを設定してmyapp.plがどのディレクトリにあっても見つかるようにするのは、彼らの責任ですか? –

1

use xxxコンパイル時ディレクティブではなく、実行時の命令です。実行しているスクリプト内でプログラムで設定することはできません。

あなたがuseが必要な場合は、あなたがあなたのモジュールが正しく配置され、使用されていることを確認するためにあなたの$PERL5LIB環境変数を設定、または#! /usr/local/perl -w -I/path/to/libxを読み取るために、あなたのシェバング行を変更する必要がrequire rather than use

を試してみる必要があるかもしれません。他の方法(local::libなど)がありますが、あなたの質問からは、インストールのコントロールはそのようなアプローチのために少し制限されているようです。

+1

これは100%真ではないが、ランタイムに 'use'を実行するために' eval'という文字列を使うことができます。 –

関連する問題