コンストラクタ

blessで自身の持っている無名ハッシュリファレンスと自身のパッケージと紐付ける。
そして、メソッドの呼び出し方にはいくつかの方法がある。
これらを組み合わせることで、C++Java風にコンストラクタを書くことが出来る。

コンストラクタの作成 - Perlプログラミング入門ゼミ - Perlでテキスト処理・Linuxサーバー管理・Webシステム開発

newメソッドとして、そこでblessする。

Java風に、new クラス名で呼び、戻り値はオブジェクトリファレンス。

[bg1@dti-vps-srv93 constructor]$ vi CustomClass.pm
[bg1@dti-vps-srv93 constructor]$ vi constructor.pl
[bg1@dti-vps-srv93 constructor]$ perl constructor.pl
$arg_list[0] = ABC
$arg_list[1] = XYZ
[bg1@dti-vps-srv93 constructor]$

できた。

Sample/perl/constructor/constructor/src/constructor at master · bg1bgst333/Sample · GitHub

メソッド

クラスのメソッドの書き方には、いくつかある。

perlobj - Perl のオブジェクト - perldoc.jp

method1に渡される引数を2番目まで出力。

アロー演算子を使った今までの方法のほかに、メソッド名の後ろにオブジェクト名、そしてメソッド名の後ろにクラス名という方法がある。
3つ目は、クラスメソッドだが。

[bg1@dti-vps-srv93 class]$ vi CustomClass.pm
[bg1@dti-vps-srv93 class]$ vi class.pl
[bg1@dti-vps-srv93 class]$ perl class.pl
method1
$arg1 = CustomClass=HASH(0xc76a68)
$arg2 = ABC
method1
$arg1 = CustomClass=HASH(0xc76a68)
$arg2 = ABC
method1
$arg1 = CustomClass
$arg2 = ABC
[bg1@dti-vps-srv93 class]$

1つ目、2つ目、ともに1番目の引数にオブジェクト自身、2番目の引数に指定した引数"ABC"が来る。
3つ目は、クラスメソッドなので、オブジェクトじゃなくてクラス名が渡されてくる。

Sample/perl/class/method/src/class at master · bg1bgst333/Sample · GitHub

bless

blessは、指定されたリファレンスと指定されたクラスを紐付ける組み込み関数。

bless関数 - オブジェクトの生成 - Perlプログラミング入門ゼミ - Perlでテキスト処理・Linuxサーバー管理・Webシステム開発

2つ目のクラス名を省略した場合は、そこのパッケージと紐付く。
この性質を使って、オブジェクト生成メソッドattachをつくる。

blessの戻り値は、完成したオブジェクトのリファレンスを指す$this自身であり、最後の行なので、このまま関数attachの戻り値になる。

$obj->method1()で呼べれば、$objがオブジェクトになってる証明。

[bg1@dti-vps-srv93 bless]$ vi CustomClass.pm
[bg1@dti-vps-srv93 bless]$ vi bless.pl
[bg1@dti-vps-srv93 bless]$ perl bless.pl
method1
[bg1@dti-vps-srv93 bless]$

呼べた。

Sample/perl/bless/bless/src/bless at master · bg1bgst333/Sample · GitHub

クラス

Perlにおいて、クラスの正体はモジュールである。

Perlでオブジェクト指向プログラミング - Perlプログラミング入門ゼミ - Perlでテキスト処理・Linuxサーバー管理・Webシステム開発

ただし、オブジェクトを作る方法が特殊で、オブジェクトの正体はリファレンス(だいたいハッシュリファレンス)であり、組み込み関数blessを使って、オブジェクト(=リファレンス)とクラス名を紐づける作業が必要になる。

method1はそのまま出力、method2は第1引数を出力、method3は第2引数まで出力。

無名ハッシュリファレンス$objを用意して、blessに$objとCustomClassを渡す。
blessのこの仕組み、これはもうこういうものとしか言いようがない。
この謎の呪文の後に、アロー演算子でメソッドを呼び出す。
method2でも引数は渡さず、method3で1つだけ渡す。

[bg1@dti-vps-srv93 class]$ vi CustomClass.pm
[bg1@dti-vps-srv93 class]$ vi class.pl
[bg1@dti-vps-srv93 class]$ perl class.pl
method1
method2
$arg1 = CustomClass=HASH(0xe3ea68)
method3
$arg1 = CustomClass=HASH(0xe3ea68)
$arg2 = ABC
[bg1@dti-vps-srv93 class]$

ちゃんと呼べてる。
そして実は、第1引数は、オブジェクトそのものが渡されるので、出力ではこういう形になっている。
第2引数以降に、独自の引数"ABC"が渡される。

Sample/perl/class/class/src/class at master · bg1bgst333/Sample · GitHub

caller

callerは、呼び出し元情報を取得する組み込み関数。

caller関数 - 呼び出し元情報を取得する - Perlプログラミング入門ゼミ - Perlでテキスト処理・Linuxサーバー管理・Webシステム開発

func3でcallerを呼ぶ。
callerの戻り値をリストで取ると、1番目がパッケージ名、2番目がファイル名、3番目が呼び出された行番号になる。
(それ以降もあるらしい。)

13行目でfunc3を呼ぶ。

[bg1@dti-vps-srv93 caller]$ vi CustomModule.pm
[bg1@dti-vps-srv93 caller]$ vi caller.pl
[bg1@dti-vps-srv93 caller]$ perl caller.pl
func1
func2
func3
$pkg = main
$file = caller.pl
$line = 13
[bg1@dti-vps-srv93 caller]$

mainパッケージ、caller.pl、13行目、合ってる。

Sample/perl/caller/caller/src/caller at master · bg1bgst333/Sample · GitHub

Exporter::@EXPORT_OK

@EXPORTは、無条件で公開されたが、@EXPORT_OKは、use モジュールパッケージ名の後の引数に指定した関数名と同じものなら公開される。

Exporter - 関数をエクスポートする - Perlプログラミング入門ゼミ - Perlでテキスト処理・Linuxサーバー管理・Webシステム開発

@EXPORT_OKに、public_method_3が入っている。

#!/usr/bin/perl

# CustomModuleをuseで読み込む.
use CustomModule;

# public_method_3を呼ぶ.
public_method_3();

このままだと、

[bg1@dti-vps-srv93 Exporter]$ vi Exporter.pl
[bg1@dti-vps-srv93 Exporter]$ perl Exporter.pl
This is BEGIN.
Undefined subroutine &main::public_method_3 called at Exporter.pl line 7.
[bg1@dti-vps-srv93 Exporter]$

公開されてないのでエラー。

引数に公開したい関数名を渡すと、

[bg1@dti-vps-srv93 Exporter]$ vi Exporter.pl
[bg1@dti-vps-srv93 Exporter]$ perl Exporter.pl
This is BEGIN.
public_method_3.
[bg1@dti-vps-srv93 Exporter]$

使える。

Sample/perl/Exporter/EXPORT_OK/src/Exporter at master · bg1bgst333/Sample · GitHub

useの引数

useには、引数を渡すことが出来る。

use - モジュールを読み込む - Perlプログラミング入門ゼミ - Perlでテキスト処理・Linuxサーバー管理・Webシステム開発
独自のimport関数を定義する話 - Qiita

よく渡されるのは、公開してもらいたい関数名リストだが、この辺はExporter.pmの実装が関係してくる。
その前に、Exporter.pmを継承していない場合どうなるか。

importの引数として渡される。
実は、useの後ろのパッケージ名が1つ目の引数で、自分で渡した独自の引数は2番目になる。

ABCを渡してみる。

[bg1@dti-vps-srv93 use]$ vi CustomModule.pm
[bg1@dti-vps-srv93 use]$ vi use.pl
[bg1@dti-vps-srv93 use]$ perl use.pl
This is BEGIN.
This is import.
$arg1 = CustomModule
$arg2 = ABC
[bg1@dti-vps-srv93 use]$

パッケージ名のCustomModuleと、独自に指定したABCがimportに渡される。

Sample/perl/use/argument/src/use at master · bg1bgst333/Sample · GitHub