お知らせ
現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。
PerlのクラスはPythonみを感じる奥ゆかしい作りになっている。
ファクトリ関数でオブジェクトを生成して、そのオブジェクトの参照を引き回すことで実現してる感じ。
Env | Ver |
---|---|
Perl | 5.34.0 |
ファイル拡張子は.pm
が一般的だと思われる。ファイル名とクラス名がリンクしているためPath/To/UpperCamel.pm
が多分いい
ハッシュに突っ込んでいく方式
# これがクラス名になる。PATH::TO::NAME構文で書く
package Example;
use strict;
# コンストラクタ
# 第一引数にはpackageのフルパスが入り、第二引数以降に通常引数が入る
sub new {
# 祝福することでインスタンスオブジェクトを生成できる
my $self = bless({}, shift);
# フィールドに値を突っ込む。これがプロパティになる。アクセサはない
$self->{hoge} = shift;
$self->{piyo} = shift;
# インスタンスを返す
return $self;
}
# メソッド
# 第一引数にはインスタンスオブジェクトが入る。アクセサはない
sub get_hoge {
my $self = shift;
return $self->{hoge};
}
1;
オブジェクト生成時にアサインする方式
package Example;
use strict;
sub new {
my ($class, @args) = @_;
my $self = bless({
hoge => shift @args,
piyo => shift @args
}, $class);
return $self;
}
sub get_hoge {
my $self = shift;
return $self->{hoge};
}
1;
ディレクトリ構成
├─library
│ └─Example.pm
└─main.pl
コード
クラスのコードは前述の内容
use strict;
# useするモジュールのパスを指定するおまじない
# パスにはクラスファイルを格納している根本のパスを指定する
# 標準モジュールは区別されるようで、この行の下にuse IPC::Open2;とか書いても、ちゃんと本来のモジュールが読み込まれる
use lib './library';
use Example;
# コンストラクタ呼び出しは()で囲まないとエラーになる
my $ex = Example->new("aaaa", 123);
print $ex->{hoge}."\n";
print $ex->{piyo}."\n";
print $ex->get_hoge."\n";
基底クラス
package Example;
use strict;
sub new {
my $self = bless({}, shift);
$self->{hoge} = shift;
$self->{piyo} = shift;
return $self;
}
sub get_hoge {
my $self = shift;
return $self->{hoge};
}
1;
子クラス
package ExampleChild;
use strict;
use parent 'Example';
sub new {
my ($class, @args) = @_;
my $self = $class->SUPER::new(shift @args, shift @args);
$self->{fuga} = shift @args;
return $self;
}
1;
仮引数を名前付きで取るかshift
で取るかは微妙に悩む。shift
の方がPerlらしい気もするし、変数名を変更するときの手間を考えると楽ではある。しかしshift
は読みづらいし、名前付き変数を列挙したほうが読みやすい気もする。
今回Perlをある程度書いてみた感じ、Perlはかなり書き方が自由に感じたし、そこはかなり楽しかったが、コーディング規約という面で見ると自由すぎると困る部分もあるし、判り易いほうがいいのでshift
は避けたほうがよさそうだ。
しかし普段JSを書いたりしている中で、クラスとは新しいオブジェクトを返す関数なのでは?と思っていたので、その辺りの解像度が上がったのは良かった。
ぶっちゃけまともにPerlを書くのはこれが初めてなので、クラスとは直接関係ないサイトもある。
perldoc.jpは公式ドキュメントの日本語訳らしい。今も更新されている。