Perl-packages-modules

提供:Dev Guides
移動先:案内検索

Perl-パッケージとモジュール

パッケージとは何ですか?

*package* ステートメントは、現在の名前付けコンテキストを指定された名前空間(シンボルテーブル)に切り替えます。 したがって-
  • パッケージは、独自の名前空間に存在するコードのコレクションです。
  • 名前空間は、一意の変数名の名前付きコレクションです(シンボルテーブルとも呼ばれます)。
  • 名前空間は、パッケージ間の変数名の衝突を防ぎます。
  • パッケージを使用すると、モジュールの構築が可能になります。使用すると、モジュールの名前空間外の変数や関数が上書きされなくなります。
  • パッケージは、別のパッケージステートメントが呼び出されるまで、または現在のブロックまたはファイルの終わりまで有効です。
  • :: パッケージ修飾子を使用して、パッケージ内の変数を明示的に参照できます。

次に、ファイルにmainパッケージとFooパッケージがある例を示します。 ここでは、パッケージ名の出力に特殊変数PACKAGEが使用されています。

#!/usr/bin/perl

# This is main package
$i = 1;
print "Package name : " , __PACKAGE__ , " $i\n";

package Foo;
# This is Foo package
$i = 10;
print "Package name : " , __PACKAGE__ , " $i\n";

package main;
# This is again main package
$i = 100;
print "Package name : " , __PACKAGE__ , " $i\n";
print "Package name : " , __PACKAGE__ ,  " $Foo::i\n";

1;

上記のコードが実行されると、次の結果が生成されます-

Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10

BEGINブロックとENDブロック

BEGINおよびENDという名前のコードブロックをいくつでも定義できます。これらは、それぞれコンストラクターおよびデストラクタとして機能します。

BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
  • perlスクリプトがロードされコンパイルされた後、他のステートメントが実行される前に、すべての BEGIN ブロックが実行されます。
  • すべてのENDブロックは、perlインタープリターが終了する直前に実行されます。
  • BEGINブロックとENDブロックは、Perlモジュールを作成するときに特に役立ちます。

次の例は、その使用法を示しています-

#!/usr/bin/perl

package Foo;
print "Begin and Block Demo\n";

BEGIN {
   print "This is BEGIN Block\n"
}

END {
   print "This is END Block\n"
}

1;

上記のコードが実行されると、次の結果が生成されます-

This is BEGIN Block
Begin and Block Demo
This is END Block

Perlモジュールとは何ですか?

Perlモジュールは、拡張子が.pmのパッケージの名前と同じ名前のライブラリファイルで定義された再利用可能なパッケージです。

*Foo.pm* というPerlモジュールファイルには、次のようなステートメントが含まれている場合があります。
#!/usr/bin/perl

package Foo;
sub bar {
   print "Hello $_[0]\n"
}

sub blat {
   print "World $_[0]\n"
}
1;

Perlモジュールに関するいくつかの重要なポイント

  • 関数 require および use はモジュールをロードします。
  • どちらも、モジュールを見つけるために @ INC の検索パスのリストを使用します。
  • どちらの関数も requireuseeval 関数を呼び出してコードを処理します。
  • 下部の 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  ModuleName

たとえば、モジュールが Person.pm ファイルで使用可能な場合、次のコマンドを発行するだけです-

$h2xs -AX -n Person

これは、次の結果を生成します-

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.gzファイルに tar すると、出荷できます。 適切な手順でREADMEファイルを更新する必要があります。 tディレクトリにいくつかのテスト例ファイルを提供することもできます。

Perlモジュールのインストール

tar.gzファイルの形式でPerlモジュールをダウンロードします。 次のシーケンスを使用して、 Person.tar.gz ファイルとしてダウンロードされたPerlモジュール Person.pm をインストールします。

tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install

Perlインタープリターには、モジュールを検索するディレクトリーのリストがあります(グローバル配列@INC)。