だるろぐ

だるいぶろぐです

my Class $self = shift; # fields.pm

Cache::Memcached のソースを見てて、知らない my の使い方をしてるのを見つけた。

sub new {
    my Cache::Memcached $self = shift;
    $self = fields::new( $self ) unless ref $self;

fields.pm を使うとこう書けるようで。ググればいくらでも出る上に perldoc 見れば済むのだけど。

package Foo;
use strict;
use warnings;
use fields qw/hoge huga _bar/;

sub new {
    my Foo $self = shift;
    unless (ref $self) {
        $self = fields::new($self);
    }
    $self->{hoge} = 2;
    $self->{huga} = 4;
    $self;
}

package main;
use strict;
use warnings;
use Data::Dumper;sub p {warn Dumper @_;my @c = caller;print STDERR "  at $c[1]:$c[2]\n\n"}

my $f = Foo->new;
p $f;
p ref $f;
p $f->{hoge};
p $f->{huga};
$VAR1 = bless( [
                 bless( {
                          'huga' => 2,
                          'hoge' => 1,
                          '_bar' => 3
                        }, 'pseudohash' ),
                 2,
                 4
               ], 'Foo' );
$VAR1 = 'Foo';
$VAR1 = 2;
$VAR1 = 4;

仮想ハッシュとか言うらしい。
_ で始まるキーはプライベートに出来るとか。
だがそもそもこれを使って嬉しいような状況に遭遇した事は無い上に力尽きたので終わり。
そして別にfields.pmを使わなくても my Class $self とは書ける。

どうでもいいが、せっかくなので my の定義を見ようと思って

  • perldoc -f my
  • perldoc perlsub
  • perldoc attributes

見ても分からん上に git clone git://perl5.git.perl.org/perl.git perl してperlのソースから探そうと思ったけどembed.fncの中に my.c ってワードを見つけたくらいで肝心のmy.cがmakeっても見つからん上にそもそもソースが読めるわけも無いので不貞寝する。