【发布时间】:2011-10-04 11:31:34
【问题描述】:
这是我所拥有的重要子集:
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() 的代码,如果没有传入任何内容,这些代码就不会崩溃。
【问题讨论】:
标签: perl oop perl-module