Shogo's Blog

Dec 24, 2025 - 1 minute read - perl

Perlクラスのレキシカルメソッドを試してみる

この記事は、Perl Advent Calendar 2025 23日目の記事です。 22日目は@shogo82148で「Perlのフィールド変数の:writer属性を試してみる」でした。

背景

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

クラスにレキシカルメソッドが実装されたらしいので、これを試してみます。

レキシカルメソッドの使い方

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

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

class LexicalMethod {
    my method abc ($x, $y) {
        say "Internal method abc invoked with x=$x y=$y";
    }

    method xyz {
        $self->&abc("x", "y");
    }
}

my $obj = LexicalMethod->new();
$obj->xyz();

# エラーになる例:
$obj->abc("hello", "world");

実行すると以下のような結果が得られます:

Internal method abc invoked with x=x y=y
Can't locate object method "abc" via package "LexicalMethod" at ./my-method.pl line 20.

レキシカルメソッドは現在のスコープ内からのみ参照できます。 これを使うことで他の言語で言うところのプライベートメソッドを実現できます。 スコープ内から呼び出すときは $self->abc ではなく、 $self->&abc になる点に注意が必要そうですね。

さきほどの実行例から、実際にスコープ外がアクセスしようとすると「そんなメソッドは定義されてないよ」と怒られてエラーになることがわかります。

まとめ

Perl 5.42.0に導入されたレキシカルメソッドで遊んでみました。 class機能自体がまだ実験的機能の扱いなので、レキシカルメソッドにも変更が入る可能性があります。 利用する人は注意してください。


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

ぼくはウサギ、コード畑で跳ねるよ 🐇
字句的メソッド、内緒の扉を覗くよ 🔐
クラスの中でこっそり歌うメロディ、
記事になって光る夜明け、
新しい一行に耳をすますよ ✨

by CodeRabbit

参考