この記事は、Perl Advent Calendar 2023 24日目の記事(代打)です。 23日目は@doikojiで「【さらばpptxよ】perlとJavaScriptとHTMLで超手軽にスライドを作る」でした。
今年のPerlの重大ニュースといえば 「PerlにClass構文がやってきた」 ことですよね[要出典]。 (※ただしExperimental) Advent Calendar でClassをメインに取り上げることなかったなと思ったので、ちょっと触ってみました。
とりあえず動かしてみる
perlclassの例です。
警告が出ないように no warnings 'experimental::class'
で抑制だけしました。
use v5.38;
use feature 'class';
no warnings 'experimental::class';
class My::Example 1.234 {
field $x;
ADJUST {
$x = "Hello, world";
}
method print_message {
say $x;
}
}
My::Example->new->print_message;
実行すると Hello, world
と出力されます。
Hello, world
newの引数を受け取る
My::Example->new
には引数を渡すことができます。
Perl 5.38時点では :param
field属性を使って、フィールドを初期化できるようです。
use v5.38;
use feature 'class';
no warnings 'experimental::class';
class My::Example 1.234 {
field $message :param; # new の引数で変更できる
method print_message {
say $message;
}
}
my $obj = My::Example->new(message => "Hello World");
$obj->print_message;
パラメーターのバリデーション処理が欲しくなるところですが・・・今のところないみたい?今後に期待ですね。
メソッドの中からメソッドを呼び出す
methodの中から、対象のインスタンスを明示せずに他のメソッドを呼び出すとエラーになります。
use v5.38;
use feature 'class';
no warnings 'experimental::class';
class My::Example 1.234 {
field $message :param;
method message {
return $message;
}
method print_message {
say message; # Cannot invoke method "message" on a non-instance at class.pl line 13.
}
}
my $obj = My::Example->new(message => "Hello World");
$obj->print_message;
$self
という変数で、現在のインスタンスにアクセスできます。
use v5.38;
use feature 'class';
no warnings 'experimental::class';
class My::Example 1.234 {
field $message :param;
method message {
return $message;
}
method print_message {
say $self->message;
}
}
my $obj = My::Example->new(message => "Hello World");
$obj->print_message;
まとめ
Perlにクラスがやってきました! 実験的な導入ということもあり、本当に基本的なことができるのみですが、大きな一歩を踏み出しました。 今後の発展が楽しみですね。
明日25日目は@shogo82148で「AWS::LambdaがCanada West (Calgary) Regionで利用可能になりました」です。 お楽しみに!