モジュール(module)とは、あらゆる共通関数を集めてプログラムから参照する事ができる関数群です。
Javaの登場以来、JFCやMS系のMFCなどCLASS/クラスの概念が様々な言語で採用されています。
同様にPerlもバージョン5以降は、Perlに従来からあったモジュールpackageとリファレンスを使ってオブジェクト指向を実現し、クラスの概念が取り入れられるようになり、スーパークラス、サブクラス、多重継承を含む継承、オーバーライドなども実装できるようになっています。
複数のファイルで共通化できるファイル 先人の技術を記述したファイル |
また、言語によっては
クラス(既にある役割を持った関数の集合体) |
等をscriptやプログラムでそこに記述されているかのように利用できるよう読み込むことです。
Perlモジュールの配布は主にCPANが行っています。
Perl5以降のバージョンでは、モジュールは『use』、ファイルは『require』と使い分けができます。
このように多くの場合、Perlは外部モジュールや外部ファイルを取り込む形で機能を拡張できるようになっていますが、他方strictやwarnings、その他予約されている命名規則上、全て小文字とされているプラグマ(pragma、拡張子は、やはり.pm)というPerlに組み込まれたモジュールがあり、やはり『use』で読み込みます。
ちなみにPerl4までは、『use』という宣言はなく、『use』用途も『require』されていました。
『package』については従来からあるもので
package Packagename;
...
1;
のようにpackage宣言によってパッケージ名(プラグマ以外のユーザー定義、拡張定義モジュールは先頭文字のみ大文字とするのが慣例)を宣言し、ファイル末尾にPerlで正常終了を意味する1;を付加(他にできることもありますが最低限)、ファイル名としてその宣言したパッケージ名に拡張子.pmを付加したものがいわゆるモジュールと過去から現在に至るまで呼ばれているという経緯があり、Perl5以降では、そのpackageとリファレンスを組み合わせてクラスとして利用できるように作られています。
ファイルを読み込む『require』は、.plなど拡張子付きファイル名で読み込み、『use』でモジュール(.pm)を読み込む際には拡張子は不要です。
use KCONV; require "jcode.pl"; |
このように『半角スペース』1つに続けて『読み込むファイル』を指定し、行の終端を表す『;(セミコロン)』を記述します。
strict.pm | 厳密な文法チェックを行うPerl組み込みのプラグマモジュール |
Strict.pm | 厳密な文法チェックを行うモジュール |
warnings.pm | 厳密に警告出力を行うPerl組み込みのプラグマモジュール |
Warnings.pm | 厳密に警告出力を行うモジュール |
CGI.pm | フォームデータの読み込み・cookie利用・HTML生成等を比較的容易にするCGI用Perl5標準モジュール |
DBI.pm | 主要データベース接続(PostgreSQL/MySQL/Oracle/SQL Server...)用モジュール |
Encode.pm | 汎用言語モジュール |
KCONV.pm | 日本語対応モジュール |
Jcode.pm | |
jcode.pl | |
cgi-lib.pl | CGI用基本ライブラリモジュール |
組み込みモジュール以外で必要なモジュールは、基本的にPerlモジュール専門サイトhttp://www.cpan.org/で無償配布されています。
Perlにはパッケージと言う概念があり、パッケージは
package Name ;
のようなスタイルで宣言され、HTML/XHTML/XML/XSL/XSLTなど他で言えば名前空間に相当します。
[package]宣言は、ファイル全体に作用させる場合には、ファイル冒頭に、任意の位置で作用させたい場合には、当該個所で宣言することができ、クラス/モジュールにおいてはファイル冒頭での[package]宣言が必須です。
Perlの関数や変数は、パッケージの中でそのスコープはグローバルであり、何れも[package]宣言が、そのスコープの一定の区切りとなります。
但し、変数についてはそれ以前にスコープの制約を設定することができる関数としてPerl組み込み関数であるmy()/our()/local()があります。
この時、[package]宣言されるモジュール・クラスを[use]で取り込めば、基本的には、読み込んだスクリプト内でも、そのモジュール・クラス内の関数や変数におけるパッケージ名を省略することができますが、(望ましくないと思われるものの)結構例外も存在します。
尚、[package]名がない場合には、パッケージ[main]が省略されたものとして扱われます。
[package]宣言されない通常のスクリプトファイルは、クラスでもモジュールでもないですし、普通[package]宣言が明示的に記述されることはありませんが、あたかもファイル先頭にpackage main;と記述されたかの様に暗黙の内にパッケージ[main]にあることが前提となっているということです。
例えば、通常省略されているパッケージ[main]を省略しない場合、
$ret=0;
という変数宣言と初期化でさえも
# Perl4
$main'ret=0;
# Perl5
$main::ret=0;
であり、
print $ret;
という出力文でさえも
# Perl4
main'print $main'ret;
# Perl5
main::print $main::ret;
のようにPerl4ではアポストロフィ[']を伴って[module']、Perl5ではコロン2つ[::]を伴って[module::]といったスタイルで明記する必要があります。
ちなみに[require]で取り込まれるスクリプトファイル含む[package]宣言されていないファイルは、何れもパッケージ[main]が省略されたものとして扱われる為、ファイルを分割しても1つのスクリプトファイルのように機能します。