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 { ... }
  • すべて BEGIN ブロックは、perlスクリプトがロードおよびコンパイルされた後、他のステートメントが実行される前に実行されます。

  • すべての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のパッケージの名前と同じです。

と呼ばれるPerlモジュールファイル Foo.pm このようなステートメントが含まれる場合があります。

#!/usr/bin/perl

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

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

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

  • 機能 require そして use モジュールをロードします。

  • どちらも検索パスのリストを使用します @INC モジュールを見つけるために。

  • 両方の機能 require そして use を呼び出す eval コードを処理する関数。

  • ザ・ 1; 下部にあると、evalはTRUEと評価されます(したがって失敗しません)。

要求関数

モジュールは、を呼び出すことによってロードできます require 次のように機能します-

#!/usr/bin/perl

require Foo;

Foo::bar( "a" );
Foo::blat( "b" );

サブルーチン名は、それらを呼び出すために完全に修飾されている必要があることに注意してください。サブルーチンを有効にするといいでしょうbar そして blat Foo ::修飾子を使用する必要がないように、独自の名前空間にインポートされます。

使用機能

モジュールは、を呼び出すことによってロードできます 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サブルーチン。eXternalはPerlの外部、つまりCを意味します)。

  • -n モジュールの名前を指定します。

したがって、上記のコマンドは、Personディレクトリ内に次の構造を作成します。実際の結果は上に示されています。

  • Changes
  • Makefile.PL
  • MANIFEST(パッケージ内のすべてのファイルのリストが含まれています)
  • README
  • t /(テストファイル)
  • lib /(実際のソースコードはここにあります

だから最後に、あなたは tarこのディレクトリ構造をファイルPerson.tar.gzに入れて、出荷できます。適切な手順でREADMEファイルを更新する必要があります。tディレクトリにいくつかのテスト例ファイルを提供することもできます。

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

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

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

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