use宣言はrequire宣言プラスExporterモジュールのimport関数?

Perl初心者のためのPerlノートです!

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

◆ はじめに

本ページは、私がPerlを習得した時(いや習得中)のノートです。

ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。

それは、

です。

本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。

そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

◆ サイト最新情報

◆ コンテンツ

2008-02-05 use宣言はrequire宣言プラスExporterモジュールのimport関数?

use宣言とは、実は、BEGINサブルーチン内でのrequire宣言とExporterモジュールのimportメソッド実行と、ほぼイコールなのです。

ほぼイコールと書いたのは、importメソッドがない場合は、呼び出しはスキップされ、また、importメソッドの自作が可能だからです。

しかし、普通、Exporterモジュールを継承してそのimportメソッドを使用します。

テストサンプルソース(testx.pl)
#use testx;
BEGIN { require testx; testx->import;} # use testx; と等価
#use testx qw($Y);
BEGIN { require testx; testx->import(qw($Y));} # use testx qw($Y);と等価
print "X=$X ", \$X, "\n";
print "Y=$Y\n";
print sum(5,3),"\n";
モジュールソース(testx.pm)
package testx;
#use Exporter;
#our @ISA    = qw(Exporter);
use base Exporter;          # use Exporter; our @ISA = qw(Exporter); と等価
our @EXPORT = qw($X &sum);
our @EXPORT_OK = qw($Y);
our $X = 10;
our $Y = 20;
sub sum {
 return $_[0]+$_[1]; # 渡された引数2つを加えて返す処理
}
print "in testx.pm : X=", \$X, "\n";
1;
処理結果
C:\Documents and Settings\xxx>perl testx.pl
in testx.pm : X=SCALAR(0x1ae706c)
X=10 SCALAR(0x1ae706c)
Y=20
8
補足1(Exporter、@ISA 、@EXPORT 、@EXPORT_OK)
Exporterの使用方法
package Module;

use Exporter;
@ISA = (Exporter);
@EXPORT = qw(sub1 sub2);

ここで登場した@ISAは、配列の各要素に、パッケージのベースクラスに当たるパッケージの名前を格納します。クラスは、@ISAにある順番でメソッドの検索を行います。

上記は、「use Exporter」で、Exporterモジュールを使用することを宣言し、@ISAにExporterを代入しています。次に@EXPOERTにインクルードさせたいサブルーチンを指定しています。ここではサブルーチンの sub1 と sub2 を自動的にインクルードするように指示しています。インクルード可能にしたサブルーチンは、インクルード先でパッケージ修飾を省略して sub1() のように宣言できます。

上記のモジュールを別のスクリプトから呼び出し、sub1 を実行するには次のようになります。

use Module;

sub1();

サブルーチン名を指定しない場合には、パッケージ内で定義されている全てのサブルーチンがインポート可能になります。

@EXPORT_OKを使用すると、@EXPORTのように定義したサブルーチンが呼び出し可能になりますが、呼び出し側で明示的に指定しなければなりません。

@EXPORT_OK
package Module;

use Exporter;
@ISA = (Exporter);

@EXPORT = qw(sub1 sub2);
@EXPORT_OK = qw(sub3);

sub sub1{ print "sub1\n"; }
sub sub2{ print "sub2\n"; }
sub sub3{ print "sub3\n"; }

sub1、sub2は「use モジュール名」で自動的にインポートされますが、 sub3はインポートされません。 sub3をインポートするには、「use モジュール名 qw(sub3)」のように明示的にインポートを指定します。

# 明示的に sub3 をインポートする。
# sub1、sub2 は自動的にインポートされます。
use Module qw(sub3); 

sub3();
http://www.rfs.jp/sb/perl/04/01.html#2.モジュール

補足2(BEGINサブルーチンについて)

BEGINサブルーチンは、スクリプトのコンパイル時に自動的に1回のみ呼び出されます。

http://d.hatena.ne.jp/chaichanPaPa/20071011/1192098600

◆ おすすめ Perl本

■ 続・初めてのPerl 改訂版

『初めてのPerl』の次ぎに読むと吉です。

結構いいですが・・・、初心者にはちょっと難しいかもです。

■ 結城浩のPerlクイズ

この本には、ちゃいちゃんパパの小話しが載っています(謎)。

ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!

結城浩のPerlクイズ

■ 新版Perl言語プログラミングレッスン入門編

実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。

新版Perl言語プログラミングレッスン入門編

■ CGI&Perlポケットリファレンス (Pocket reference)

この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。

CGI&Perlポケットリファレンス (Pocket reference)

■ Perlベストプラクティス

一読の価値有りだと思います。

Perlベストプラクティス

■ プログラミングPerl〈VOLUME1〉

ご存知、Perl本の聖書、ラクダ本(上)です。

■ プログラミングPerl〈VOLUME2〉

ご存知、Perl本の聖書、ラクダ本(下)です。

◆ おわりに

最後に、本ページが、何かのお役に立てれば幸いです。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo