Perl-modules
PERLモジュールの作成
パッケージとは何ですか?
- パッケージは、独自の名前空間に存在するコードのコレクションです
- 名前空間は、一意の変数名の名前付きコレクションです(シンボルテーブルとも呼ばれます)。
- 名前空間は、パッケージ間の変数名の衝突を防ぎます
- パッケージを使用すると、モジュールの構築が可能になります。モジュールを使用すると、モジュールの名前空間外の変数や関数を削除できません
パッケージステートメント
- packageステートメントは、現在のネーミングコンテキストを指定されたネームスペース(シンボルテーブル)に切り替えます
- 指定されたパッケージが存在しない場合、新しい名前空間が最初に作成されます。
$i = 1; print "$i\n"; # Prints "1"
package foo;
$i = 2; print "$i\n"; # Prints "2"
package main;
print "$i\n"; # Prints "1"
- パッケージは、別のパッケージステートメントが呼び出されるまで、または現在のブロックまたはファイルの終わりが終わるまで有効です。
- :: パッケージ修飾子を使用して、パッケージ内の変数を明示的に参照できます。
$PACKAGE_NAME::VARIABLE_NAME
For Example:
$i = 1; print "$i\n"; # Prints "1"
package foo;
$i = 2; print "$i\n"; # Prints "2"
package main;
print "$i\n"; # Prints "1"
print "$foo::i\n"; # Prints "2"
BEGINブロックとENDブロック
コンストラクターおよびデストラクタとしてそれぞれ機能する、BEGINおよびENDという名前のコードブロックをいくつでも定義できます。
BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
- perlスクリプトがロードおよびコンパイルされた後、他のステートメントが実行される前に、すべての BEGIN ブロックが実行されます
- すべてのENDブロックは、perlインタープリターが終了する直前に実行されます。
- BEGINブロックとENDブロックは、Perlモジュールを作成するときに特に役立ちます。
Perlモジュールとは何ですか?
Perlモジュールは、名前がパッケージの名前と同じライブラリファイルで定義された再利用可能なパッケージです(末尾に.pmが付きます)。
「Foo.pm」というPerlモジュールファイルには、次のようなステートメントが含まれる場合があります。
#!/usr/bin/perl
package Foo;
sub bar {
print "Hello $_[0]\n"
}
sub blat {
print "World $_[0]\n"
}
1;
モジュールに関するいくつかの注目すべき点
- 関数 require および use はモジュールをロードします。
- どちらも、モジュールを見つけるために @ INC の検索パスのリストを使用します(変更できます!)。
- 両方とも eval 関数を呼び出してコードを処理します
- 下部の 1; により、evalはTRUEと評価されます(したがって失敗しません)。
Require関数
モジュールは require 関数を呼び出すことでロードできます
#!/usr/bin/perl
require Foo;
Foo::bar( "a" );
Foo::blat( "b" );
サブルーチン名は完全に修飾する必要があることに注意してください(独自のパッケージで分離されているため)
Foo ::修飾子を使用する必要がないように、関数barとblatを独自のネームスペースにインポートできるようにすると便利です。
使用機能
モジュールは use 関数を呼び出すことでロードできます
#!/usr/bin/perl
use Foo;
bar( "a" );
blat( "b" );
パッケージの関数名を完全に修飾する必要がないことに注意してください。
use関数は、モジュール内にいくつかのステートメントが追加されている場合、モジュールからシンボルのリストをエクスポートします
require Exporter;
@ISA = qw(Exporter);
次に、 @ EXPORT という名前のリスト変数を入力して、シンボルのリスト(スカラー、リスト、ハッシュ、サブルーチンなど)を提供します。
package Module;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);
sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" }
sub splat { print "Not $_[0]\n" } # Not exported!
1;
Perlモジュールツリーを作成する
PERLモジュールを出荷する準備ができたら、Perlモジュールツリーを作成する標準的な方法があります。 これは、 h2xs ユーティリティを使用して行われます。 このユーティリティはPERLに付属しています。 h2xsを使用する構文は次のとおりです。
$h2xs -AX -n Module Name
# For example, if your module is available in Person.pm file
$h2xs -AX -n Person
This will produce following result
Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST
これらのオプションの説明は次のとおりです
- -A はオートローダーコードを省略します(頻繁に使用されない多数のサブルーチンを定義するモジュールで最適に使用されます)
- -X はXS要素を省略します(eXternal Subroutine、eXternalはPerlの外部を意味します。 C)
- -n はモジュールの名前を指定します
したがって、上記のコマンドはPersonディレクトリ内に次の構造を作成します。 実際の結果は上に示されています。
- 変更点
- Makefile.PL
- MANIFEST(パッケージ内のすべてのファイルのリストが含まれています)
- README
- t/(テストファイル)
- lib/(実際のソースコードはここにあります
最終的に、このディレクトリ構造を* Person.tarファイルに tar し、出荷できます。 適切な手順でREADMEファイルを更新する必要があります。 tディレクトリにいくつかのテスト例ファイルを提供できます。
Perlモジュールのインストール
Perlモジュールのインストールは非常に簡単です。 次のシーケンスを使用して、Perlモジュールをインストールします。
perl Makefile.PL
make
make install
Perlインタープリターには、モジュールを検索するディレクトリのリストがあります(グローバル配列@INC)