師匠の散歩

きままにPerlでも

モジュールの基本

モジュールを設置する/ mod01.cgi

テストエリア
module name = test02.pm <> 
special variable $0 = mod01.cgi <>
Test02.pm <> Test02
module name = test02.pm <> special variable $0 = mod01.cgi <> Test02.pm <> Test02
module name = test02.pm <> special variable $0 = mod01.cgi <> Test02.pm <> Test02
Test02のグローバル変数:グローバル変数 Test02のグローバル配列:前 中 後
Test02内のみのグローバル変数:データ

モジュールとは、コードを再利用する際の単位となるもの。モジュールは、パッケージ名をファイル名として、拡張子は .pm になる。モジュール内にパッケージが複数ある場合は、中心的なパッケージ名を使う、モジュール名は、先頭が大文字


呼び出し側 mod01.cgi
#!/usr/local/bin/perl
use Test02;                              # モジュールを use で呼び出す

print "Content-type: text/html\n\n";                   

Test02::sub1();                          # 3種類とも使用可能な使い方
sub1();                                  # まんなかの使い方がシンプルでGood
&sub1;

print "Test02のグローバル変数:$var\n";  # モジュールのグローバル変数も呼び出せる
print "Test02のグローバル配列:@var2\n"; # 配列も同様、たぶんハッシュもできるだろう

print "Test02内のみのグローバル変数:$Test02::localvar\n";

exit;

呼び出されるモジュール:Test02.pm
package Test02;                           # パッケージ名(ファイル名)の宣言

use Exporter;                             # インポート可能にする
@ISA = (Exporter);
@EXPORT = qw(sub1 sub2 sub3 $var @var2);  # 関数名だけでなく、変数($や@など)も並べることができる

$var  = "グローバル変数";
@var2 = ("前","中","後");

$localvar = "データ";                     # モジュール内のみのグローバル関数

sub sub1 {
 print "module name = test02.pm <> \n";
 print "special variable \$0 = $0 \n";    # 特殊変数は、メインのものが継承されていた
 print __FILE__;                          # ファイル名は、これが書かれたファイル名になる
 print " <> ";
 print __PACKAGE__;                       # これも書かれた場所のパッケージ名になる
 
 print $Test02::localvar;                 # 変数の前の$が、モジュールの前に来る
                                          # @や%も同様に扱える
}
sub sub2 {
}
sub sub3 {
}

1;                                        # 最後を 1; にする

パッケージとモジュール、どちらが使いやすいかはいろいろあるが、個人的な考えを以下に示す。

  1. 「パッケージ名::」が不要なのでモジュールのほうがカッコいい
  2. 拡張子「pm」をperlと判断してくれない場合がある
    ホームページサービスへのアップロードができないので、「.pl」でアップし、あとでファイル名変更で対応するしかない
  3. 将来、オブジェクトなんたらを勉強するのにモジュールのほうがよさそう

ということで、外部ファイルに関数を作成して参照する方法として、「モジュール」を採用することにする。


mod01.cgi // Topに戻る // indexに戻る
Copyright(C) 2009-2021 Grandmaster Last up : 2020/09/18