Shogo's Blog

Dec 24, 2025 - 1 minute read - perl

Perlのフィールド変数の:writer属性を試してみる

この記事は、Perl Advent Calendar 2025 22日目の記事です。 21日目は@hkobaで「Rust の libperl-sys で XS を書いてみた」でした。

背景

ネタが尽きてきたので、perldeltaから頑張ってネタを探すシリーズをやっていこうと思います。

クラスのフィールド変数に :writer 属性というのが追加されたらしいので、今回はそれを試してみます。

:writer 属性の使い方

perldelta からの例です。 class機能はまだ実験的な機能扱いなので、機能の有効化と、警告の無効化が必要なことに注意してください。

use v5.42;
use feature 'class';
no warnings 'experimental::class';

class Point {
    field $x :reader :writer :param;
    field $y :reader :writer :param;
}

my $p = Point->new( x => 20, y => 40 );
$p->set_x(60);

say "x: ", $p->x;  # 60
say "y: ", $p->y;  # 40

:writer 属性を使うと変数 x に対して set_x というメソッドが生えてきます。 これを使って変数 x の値を変更することが可能です。

メソッドチェーン

自動生成されたメソッドはインスタンス自身を戻り値として返します。 これを利用して $p->set_x(60)->set_y(80); のようにメソッドチェーンを書けます。

use v5.42;
use feature 'class';
no warnings 'experimental::class';

class Point {
    field $x :reader :writer :param;
    field $y :reader :writer :param;
}

my $p = Point->new( x => 20, y => 40 );
$p->set_x(60)->set_y(80);

say "x: ", $p->x;  # 60
say "y: ", $p->y;  # 80

メソッド名のカスタマイズ

メソッド名は変数名から自動的に生成されますが、カスタマイズすることも可能です。 たとえば set_x の代わりに write_x で変数への書き込みを行いたい場合は、:writer(write_x) のように指定します。

use v5.42;
use feature 'class';
no warnings 'experimental::class';

class Point {
    field $x :reader :writer(write_x) :param;
    field $y :reader :writer(write_y) :param;
}

my $p = Point->new( x => 20, y => 40 );
$p->write_x(60)->write_y(80);

say "x: ", $p->x;  # 60
say "y: ", $p->y;  # 80

まとめ

Perl 5.42.0に導入された :writer 属性で遊んでみました。 class機能自体がまだ実験的機能の扱いなので、:writer 属性にも変更が入る可能性があります。 利用する人は注意してください。


明日23日はTBDさんでTBDです。

🐰 新しいブログが仲間入り
Perl のクラス、:writer で輝く
セッターメソッド、自動で生成
メソッドチェーン、スムーズに流れる
技術の知識、共有して嬉しい ✨

by CodeRabbit

参考