my ($class, $x, $y) = @_; my $fields = +{ X => $x, Y => $y }; bless sub { $fields->{shift(@_)} }, $class; } sub x { my $self = shift; $self->('X'); # サブルーチンリファレンスを実行してインスタンス変数として扱えるものを取り出 } 12 / 23
PositiveInt; sub new { my ($class, $num) = @_; die 'PositiveInt must be larger than 0.' if $num < 0; bless \$num, $class; } sub num { my $self = shift; $$self; # デリファレンスすることでインスタンス変数として使える } 15 / 23