use fields のperldocにはこう書いてます。
Field names that start with an underscore character are made private to
the class and are not visible to subclasses.
これでPrivateフィールドが作れる!? と思ったら、微妙に違います。
use strict; use warnings; { package MyBase; use fields qw(name _age); sub new{ my $class = shift; my __PACKAGE__ $self = fields::new($class); $self->{name} = 'Mery'; $self->{_age} = 22; return $self; } } { package MySub; use base qw(MyBase); use fields qw(height _weight); sub new{ my $class = shift; my __PACKAGE__ $self = $class->SUPER::new(); $self->{height} = 140; $self->{_weight} = 40; return $self; } } package main; use Data::Dumper; my MySub $sub = MySub::->new(); print "name : ", $sub->{name} , "\n"; print "height : ", $sub->{height} , "\n"; print "_age : ", $sub->{_age} , "\n"; print "_weight : ", $sub->{_weight}, "\n";
こんなソースを書くと、$sub から_ageフィールドにアクセスする部分は、コンパイル時にエラーになってくれます。これは非常に嬉しい。
しかし、_weightにアクセスする部分はエラーとなりません。ここで言う Private と言うのは、あくまでもサブクラスからはアクセスできないってだけで、そのクラスのインスタンスからは、例えそのインスタンスの利用場所が違うpackage内であったとしても、普通にアクセスできてしまいます。