[解決済み】Perlの@INCはどのように構築されているのでしょうか?(別名、Perlモジュールが検索される場所に影響を与えるすべての方法は何ですか?)
質問
Perlモジュールが検索される場所に影響を与える方法には、どのようなものがありますか? または Perlの@INCはどのように構築されているか ?
ご存知の通りです。
Perlでは
@INC
ディレクトリ名を含む配列で、Perlモジュールファイルの検索場所を決定します。
.
StackOverflowには包括的な"@INC"FAQタイプの投稿がないようなので、この質問はその1つとして意図しています。
解決方法を教えてください。
この配列の内容がどのように構築され、Perlインタープリターがモジュールファイルを見つける場所に影響を与えるように操作できるかを見ていきます。
-
デフォルト
@INC
Perlインタプリタが をコンパイルして、特定の
@INC
デフォルト値 . この値を知るには、次のように実行します。env -i perl -V
コマンド(env -i
は無視されます。PERL5LIB
環境変数 - 2を参照)、出力には次のようなものが表示されます。$ env -i perl -V ... @INC: /usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld /usr/lib/perl5/site_perl/5.18.0 /usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld /usr/lib/perl5/5.18.0 .
備考
.
これはカレントディレクトリです(スクリプトのディレクトリと同じとは限りません)。これはPerl 5.26+では欠落しており、Perlを実行するときに
-T
(テイントチェックが有効)
.
Perlのバイナリコンパイルの設定時にデフォルトのパスを変更するには、設定オプションの
otherlibdirs
:
Configure -Dotherlibdirs=/usr/lib/perl5/site_perl/5.16.3
-
環境変数
PERL5LIB
(またはPERLLIB
)Perlはプリペンドで
@INC
に含まれるディレクトリのリスト(コロンで区切られたもの)を指定します。PERL5LIB
(定義されていない場合。PERLLIB
が使用されます)シェルの環境変数を使用します。の中身を見るには@INC
の後にPERL5LIB
とPERLLIB
を実行すると、環境変数が有効になります。perl -V
.$ perl -V ... %ENV: PERL5LIB="/home/myuser/test" @INC: /home/myuser/test /usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld /usr/lib/perl5/site_perl/5.18.0 /usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld /usr/lib/perl5/5.18.0 .
-
-I
コマンドラインオプションPerlはプリペンドで
@INC
の値として渡されたディレクトリのリスト(コロンで区切られたもの)を返します。-I
コマンドラインオプションを指定します。これは、Perlのオプションの常として、3つの方法で行うことができます。-
コマンドラインから渡す。
perl -I /my/moduledir your_script.pl
-
Perlスクリプトの最初の行(shebang)で渡します。
#!/usr/local/bin/perl -w -I /my/moduledir
-
の一部として渡します。
PERL5OPT
(またはPERLOPT
)環境変数(19.02章参照) Perlのプログラミング )
-
-
を介して渡します。
lib
プラグマPerlのプリペンド
@INC
を介して渡されたディレクトリのリストでuse lib
.プログラムでは
use lib ("/dir1", "/dir2");
コマンドラインでは
perl -Mlib=/dir1,/dir2
-
を直接操作することができます。
@INC
を通常のPerlの配列として使用することができます。注
@INC
はコンパイル時に使用されるので、これはBEGIN {}
ブロックの前にあるuse MyModule
ステートメントを使用します。-
を介して、先頭にディレクトリを追加します。
unshift @INC, $dir
. -
を経由して末尾にディレクトリを追加します。
push @INC, $dir
. -
Perlの配列でできることは何でもしてください。
-
注)ディレクトリは
非シフト
上に
@INC
を、この回答にある順序で、例えば、デフォルトの
@INC
はリストの最後にあり、その前に
PERL5LIB
の前にある。
-I
が先行する。
use lib
と直接
@INC
の操作で、後者の2つはPerlのコードではどのような順番で混在しています。
参考文献
- perldoc perlmod
- パールドック・ライブラリ
- Perl モジュールの仕組み - 実用的な HOW-TO を含む素晴らしいガイドです。
-
にないディレクトリにあるPerlモジュールを「使用」するにはどうすればよいのでしょうか?
@INC
? - プログラミング Perl - 第31章 第13部 第7.2.41章
- Perl プログラムは、使用する Perl モジュールを含むファイルがどこにあるかをどのように知ることができますか?
包括的な
@INC
Stack OverflowにFAQ的な投稿があるので、この質問はその1つとして意図しています。
各アプローチを使用するタイミングは?
-
あるディレクトリにあるモジュールをサイト上の多くの/すべてのスクリプトで使用する必要がある場合、特に複数のユーザーによって実行される場合、そのディレクトリをデフォルトの
@INC
をPerlバイナリにコンパイルしてください。 -
ディレクトリ内のモジュールが、特定のユーザが実行するすべてのスクリプトに排他的に使用される場合 (または、Perl の再コンパイルが、デフォルトの
@INC
を設定します。PERL5LIB
通常、ユーザーのログイン時に行われます。注意: 通常の Unix 環境変数の落とし穴に注意してください。例えば、特定のユーザーとしてスクリプトを実行しても、そのユーザーの環境が設定された状態でスクリプトが実行されるとは限りません。
su
. -
ディレクトリ内のモジュールを特定の状況でのみ使用する必要がある場合 (例: スクリプトを開発/デバッグモードで実行する場合) は、以下のように
PERL5LIB
を手動で渡すか、あるいは-I
オプションを perl に追加してください。 -
モジュールを特定のスクリプトにのみ使用する必要がある場合、by すべて を使用するユーザーは
use lib
/no lib
のプラグマをプログラム自体に組み込むことができます。また、検索するディレクトリを実行時に動的に決定する必要がある場合にも使用します。例えば、スクリプトのコマンドラインパラメータやスクリプトのパス ( FindBin モジュールは、非常に優れた使用例です)。 -
のディレクトリが
@INC
を組み合わせて実装することが不可能であったり、扱いにくかったりする、複雑なロジックに従って操作する必要があります。use lib
/no lib
プラグマを使用する場合は、直接@INC
の中で操作します。BEGIN {}
ブロック内、または@INC
このモジュールは、他のモジュールが使用される前に、スクリプトで使用されなければなりません。この例として、prod/uat/devディレクトリにあるライブラリを自動的に切り替え、devやUATにない場合はprodでウォーターフォールライブラリをピックアップします(最後の条件により、標準の "use lib + FindBin" ソリューションは非常に複雑になります)。 このシナリオの詳細な図解は以下にあります。 ベータ版 Perl モジュールをベータ版 Perl スクリプトから使用するにはどうすればよいですか? .
-
を直接操作するための追加のユースケースです。
@INC
は、サブルーチン参照やオブジェクト参照を追加できるようにすることです(はい、バージニア州。@INC
で説明されているように、ディレクトリ名だけでなく、Perlのカスタムコードを含むことができます。 INCにあるサブルーチン参照はいつ呼び出されるのですか? ).
関連
-
Perlのprint、printf、sprintfの使用例について説明します。
-
Perl学習チュートリアル - シングルラインコマンドの説明
-
Perl学習ノート - CPANの使い方入門
-
Perlにおけるtrueとfalseの徹底研究
-
Perlの制御構造に関する学習ノート
-
ip138.com のスクリプトで、perl で ip 属性を照会する。
-
dig と nali を使って DNS 解決アドレスが一貫しているかどうかを判断する Perl スクリプトです。
-
Tesseract-OCRを使用したPerl Captcha認識チュートリアル
-
プロポーズ用Perlコードの書き換えについて
-
perlは{}で変数名を変更する方法を共有します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
指定したフォルダーにあるリンク切れファイルのシンボリックリンクを自動的に削除するスクリプト
-
Perlで配列から値を削除する方法は?
-
perl 操作 MongoDB エラー 未定義のシンボル。HeUTF8 解決策
-
ip138.com のスクリプトで、perl で ip 属性を照会する。
-
Perlのコマンドラインプログラミングでよく使われるパラメータを1文にまとめたもの
-
Perlクラスタ構成管理システムRexコンサイスマニュアル
-
Perlによるファイル操作の例
-
Perl バッチクエリ ip 属性メソッドコード
-
2つのファイルを比較し、データをフィルタリングするスクリプトコード(perlで実装されている
-
プロポーズ用Perlコードの書き換えについて