スクリプトの親ディレクトリにモジュールがあり、それを「使用」したいと考えています。
私が行った場合
use '../Foo.pm';
構文エラーが発生します。
私はやろうとしました:
push @INC, '..';
use EPMS;
そして..明らかに@INCには表示されません
私はおかしくなりそうだ!ここで何が問題なのですか?
スクリプトの親ディレクトリにモジュールがあり、それを「使用」したいと考えています。
私が行った場合
use '../Foo.pm';
構文エラーが発生します。
私はやろうとしました:
push @INC, '..';
use EPMS;
そして..明らかに@INCには表示されません
私はおかしくなりそうだ!ここで何が問題なのですか?
use
コンパイル時に行われるため、これは機能します。
BEGIN {push @INC, '..'}
use EPMS;
しかし、より良い解決策は にすることですuse lib
。これは、上記をより適切に記述する方法です。
use lib '..';
use EPMS;
ただし、別のディレクトリから実行している場合は、次の使用をFindBin
お勧めします。
use FindBin; # locate this script
use lib "$FindBin::RealBin/.."; # use the parent directory
use EPMS;
変更する方法はいくつかあります@INC
。
set PERL5LIB
、perlrunで説明されているように
perlrun-I
にも記載されているコマンドラインでスイッチを使用します。これを PERL5OPT で自動的に適用することもできますが、それを行う場合は PERL5LIB を使用してください。
use lib
ただし、別のマシン上の別の人が別のディレクトリにある可能性があるため、これは脆弱です。
を手動で変更@INC
します。モジュールを使用してプルする場合は、コンパイル時にそれを行うようにしてください。それはあまりにも多くの仕事ですが。
require
ファイル名を直接。これは可能ですが、そのファイル名が同じディレクトリにファイルをロードすることはできません。これは間違いなく、コード レビューで眉をひそめるでしょう。
個人的には、モジュール (自分用または自分で制御できるシステム用に作成したモジュール) を特定のディレクトリに保持し、サブディレクトリに配置することも好みます。次のように:
/www/modules/MyMods/Foo.pm
/www/modules/MyMods/Bar.pm
そして、私がそれらを使用する場所:
use lib qw(/www/modules);
use MyMods::Foo;
use MyMods::Bar;
余談ですが、プッシュに関しては、太い矢印のコンマを好みます。
push @array => $pushee;
しかし、それは単なる好みの問題です。
@ephemientが前述したように、「use lib」が答えです。もう 1 つのオプションは、use の代わりに require/import を使用することです。これは、モジュールがコンパイル時にロードされるのではなく、実行時にロードされることを意味します。
これにより、そこで試したように @INC を変更するか、モジュール名の代わりにファイルへのパスを require に渡すことができます。「perldoc -f require」から:
EXPR がベアワードの場合、require は ".pm" 拡張子を想定し、ファイル名の "::" を "/" に置き換えて、標準モジュールを簡単にロードできるようにします。この形式のモジュールのロードでは、名前空間が変更されるリスクはありません。
push
の前に処理する必要があり、use
早期use
に処理されます。BEGIN { push @INC, ".."; }
ですから、チャンスを得るにはが必要になると思います。
「perldoc-fuse」によって報告されたように:
BEGIN { require Module; import Module LIST; }
Moduleがベアワードでなければならないことを除いて、これはまったく同じです。
別の言い方をすれば、「使用」は次のようになります。
require
-そのファイル名を入力し、import
-そのパッケージを作成します。したがって、useを呼び出す代わりに、BEGINブロック内でrequireとimportを呼び出すことができます。
BEGIN {
require '../EPMS.pm';
EPMS->import();
}
そしてもちろん、インポートを呼び出したときにモジュールが実際にシンボルのエクスポートやその他の初期化を行わない場合は、その行を省略できます。
BEGIN {
require '../EPMS.pm';
}
一部の IDE は、推奨される答えである「use lib」では正しく動作しません。「use lib::relative」が私の IDE である JetBrains の WebStorm で動作することがわかりました。
lib::relative の POD を参照してください