61

スクリプトの親ディレクトリにモジュールがあり、それを「使用」したいと考えています。

私が行った場合

use '../Foo.pm';

構文エラーが発生します。

私はやろうとしました:

push @INC, '..';
use EPMS;

そして..明らかに@INCには表示されません

私はおかしくなりそうだ!ここで何が問題なのですか?

4

8 に答える 8

107

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;
于 2008-10-08T22:11:29.073 に答える
24

変更する方法はいくつかあります@INC

  • set PERL5LIBperlrunで説明されているように

  • perlrun-Iにも記載されているコマンドラインでスイッチを使用します。これを PERL5OPT で自動的に適用することもできますが、それを行う場合は PERL5LIB を使用してください。

  • use libただし、別のマシン上の別の人が別のディレクトリにある可能性があるため、これは脆弱です。

  • を手動で変更@INCします。モジュールを使用してプルする場合は、コンパイル時にそれを行うようにしてください。それはあまりにも多くの仕事ですが。

  • requireファイル名を直接。これは可能ですが、そのファイル名が同じディレクトリにファイルをロードすることはできません。これは間違いなく、コード レビューで眉をひそめるでしょう。

于 2008-10-08T22:21:38.897 に答える
14

個人的には、モジュール (自分用または自分で制御できるシステム用に作成したモジュール) を特定のディレクトリに保持し、サブディレクトリに配置することも好みます。次のように:

/www/modules/MyMods/Foo.pm
/www/modules/MyMods/Bar.pm

そして、私がそれらを使用する場所:

use lib qw(/www/modules);
use MyMods::Foo;
use MyMods::Bar;

余談ですが、プッシュに関しては、太い矢印のコンマを好みます。

push @array => $pushee;

しかし、それは単なる好みの問題です。

于 2008-10-08T22:22:43.543 に答える
8

@ephemientが前述したように、「use lib」が答えです。もう 1 つのオプションは、use の代わりに require/import を使用することです。これは、モジュールがコンパイル時にロードされるのではなく、実行時にロードされることを意味します。

これにより、そこで試したように @INC を変更するか、モジュール名の代わりにファイルへのパスを require に渡すことができます。「perldoc -f require」から:

EXPR がベアワードの場合、require は ".pm" 拡張子を想定し、ファイル名の "::" を "/" に置き換えて、標準モジュールを簡単にロードできるようにします。この形式のモジュールのロードでは、名前空間が変更されるリスクはありません。

于 2008-10-08T22:16:38.690 に答える
3

pushの前に処理する必要があり、use早期useに処理されます。BEGIN { push @INC, ".."; }ですから、チャンスを得るにはが必要になると思います。

于 2008-10-08T22:11:14.380 に答える
2

「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';
}
于 2008-12-20T22:57:23.910 に答える
0

一部の IDE は、推奨される答えである「use lib」では正しく動作しません。「use lib::relative」が私の IDE である JetBrains の WebStorm で動作することがわかりました。

lib::relative の POD を参照してください

于 2021-01-01T16:35:30.030 に答える