アンダースコアが前に付いたフィールドに関して、文書化が不十分fields
であるプラグマの動作を理解しようとしています。これは、ドキュメントがそれについて述べていることです:
アンダースコア文字で始まるフィールド名はクラス専用になり、サブクラスには表示されません。継承されたフィールドはオーバーライドできますが、-wスイッチと一緒に使用すると警告が生成されます。
以下の私のテストによると、これは実際の動作と一致していません。サブクラス内で-prefixedフィールドが表示されるだけでなく_
、外部クラス内でも表示されます(「visible」の意味がわからない場合を除く)。また、制限されたハッシュに直接アクセスすることもできます。
fields
ソースコードにアクセスする以外に、プラグマの動作について詳しく知ることができますか?
{
package Foo;
use strict;
use warnings;
use fields qw/a _b __c/;
sub new {
my ( $class ) = @_;
my Foo $self = fields::new($class);
$self->a = 1; $self->b = 2; $self->c = 3;
return $self;
}
sub a : lvalue { shift->{a} }
sub b : lvalue { shift->{_b} }
sub c : lvalue { shift->{__c} }
}
{
package Bar;
use base 'Foo';
use strict;
use warnings;
use Data::Dumper;
my $o = Bar->new;
print Dumper $o; ##$VAR1 = bless({'_b' => 2, '__c' => 3, 'a' => 1}, 'Foo');
$o->a = 4; $o->b = 5; $o->c = 6;
print Dumper $o; ##$VAR1 = bless({'_b' => 5, '__c' => 6, 'a' => 4}, 'Foo');
$o->{a} = 7; $o->{_b} = 8; $o->{__c} = 9;
print Dumper $o; ##$VAR1 = bless({'_b' => 8, '__c' => 9, 'a' => 7}, 'Foo');
}