第23回 package

package

Perlで「名前空間」を作りたければ、
package(パッケージ)を使います。 packageは、Perlで「オブジェクト指向」を行うときの前提知識のひとつなのでしっかり覚えておきましょう。

名前空間」というのは、苗字みたいなものですね。

名前空間

use strict;

package Morning;
sub greeting {
  print 'おはよう', "\n";
}

package Night;
sub greeting {
  print 'こんばんは', "\n";
}

package main;
Morning::greeting();  # おはよう
Night::greeting();    # こんばんは

結果:

おはよう
こんばんは

名前空間を使えば、同じ関数名であっても(名前空間が違うので)呼び出すことが可能です。


大規模開発

これは、複数人で大きなソースを作っているときに有効な手段です。
同じ関数名になったり、同じ変数名を使ったとしても、パッケージが違えば、呼び出すことは可能です。


複数人でソースを分担して作るときは、各人が、意味のある機能を担当するのがコツです。
Aさんは、ファイルを取り込むところの処理を作る。
Bさんは、取り込んだファイルのデータを解析する処理を作る。
といった具合です。(※ 1人でもこれが開発のコツです)


そして、その各担当処理に見合った名前をパッケージ名とするのが開発をする上でのコツとなります。



ソースの説明

それでは、実用的なソースではありせんが、もう一度先ほどのソースを見ながら、
Perl名前空間について説明したいと思います。

(再掲)

use strict;

package Morning;
sub greeting {
  print 'おはよう', "\n";
}

package Night;
sub greeting {
  print 'こんばんは', "\n";
}

package main;
Morning::greeting();  # おはよう
Night::greeting();    # こんばんは

名前空間の範囲は、次のpackage文が出現するまでとなっています。


プログラマ同士での意思の疎通

さて、プログラマ同士の会話では、

  • Morningパッケージのgreeting関数 をここの処理で使って
  • 名前空間 Morningのgreeting関数 をここの処理で使って

などという言い方で、どちらの名前空間に所属しているのか明確にして会話したりします(※ わかれば、なんでもいいのですが)

名前空間に所属するものの示し方

名前空間を作ったのなら、いままでのように、関数名だけ書いて関数を呼び出してはいけません。
どこの名前空間に所属しているのか、プログラムに示す必要があります。
書き方は、

名前空間の名前::関数名(もしくは変数名)

と、いままで普通に関数もしくは変数の名前を書いてきた頭に ::(コロン2つ)を付けて、名前空間を示す必要があります。


ですから、関数の呼び出しは、

Morning::greeting();  # おはよう
Night::greeting();    # こんばんは

このようになります。

パッケージ内に変数を書く

実は、パッケージ内に変数を書くには、 my と our の知識が必要になってきます。
というかこの記事を書きながら、今その事実にきづいてしまいました....(残念すぎる)

ということで...

ということで、packageにより名前空間を作ることができます。
人に説明できるほどになれば、パッケージ内に変数を書く方法についてどこかで説明したいと思います。


それではまた〜