Как хеш копирует свои значения в @_? Что так можно?
Спасибо.
use Person;
$him = Person->new;
$him->name(“Aragorn”);
$him->race(“Man”);
$him->aliases( [“Strider”, “Estel”, “Elessar”] );
package Person;
use Carp;
my %Fields = (
“Person::name” => “unnamed”,
“Person::race” => “unknown”
“Person::aliases” =>[],
);
#Следущее объявление гарантирует получение собственного автозагрузчика.
use subs qw(name race aliases);
sub new {
my $invocant = shift;
my $class = ref($invocant) || $invocant;
my $self = { %Fields, @_};
bless $self, $class;
return $self;
}
sub AUTOLOAD {
my $self = shift;
# обрабатывать только методы экземпляра, но не класса
croak «$self не является объектом» unless ref($invocant);
my $name = our $AUTOLOAD;
return if $name =~ /::DESTROY$/;
unless (exists $self->{$name}) {
croak “Нет доступа к полю ‘$name’ в $self”;
}
if (@_) { return $self->{$name} = shift }
else { return $self->{$name} }
}
my $self = { %Fields, @_}; - создает ссылку на ананимный хеш и сохраняет её в локальной переменной.
%Fields,@_ - возращяет список значений
все не четные значения становятся ключами а четные значением в ананимном хеше...
P.S. насчет корректности использования выражения "ананимный хеш" не уверен