Вот важное подмножество того, что у меня есть:
sub logger {
my $self = shift;
my %def = (
type => $self->{options}{name},
severity => 1,
date => $self->now(),
message => ''
);
my %opt = %def;
if ( my $ref = shift ) {
%opt = (%def, %{$ref});
}
croak('message is a required option') if $opt{message} eq '';
warn($opt{type} . ': ' . $opt{message} . "\n") if ( $self->{_verbose} );
# Do some other interesting things.
}
Итак, я могу назвать это так:
$op->logger({message => 'Some message'});
Так что, если какой-либо из моих параметров отсутствует, ониполучить значения по умолчанию, которые я указал в хеше% def.Если требуемый параметр отсутствует, я умираю.
Основой этого является то, что я перегружаю хеш def тем, что пользователь указал с этим.
if ( my $ref = shift ) {
%opt = (%def, %{$ref});
}
Проблема в том, что они могут указатьвещи, не входящие в мой список опций, или отправлять хеш вместо хеш-ссылки, или скаляра, или undef, или многих других способов, которыми это может взорваться.
Я уверен, что есть более элегантный способчтобы справиться с этим.
Кажется, я вспомнил какой-то код, использующий ref (), который не взорвался, если ничего не было передано.