お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。

Perlでクラスを実装する

投稿日:
言語::Perl

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は公式ドキュメントの日本語訳らしい。今も更新されている。