* Ovid <[EMAIL PROTECTED]> [2005-08-12 22:15]:
> sub foo {
> my $args = shift;
> croak $message unless is_deeply [sort keys %$args], [EMAIL PROTECTED];
> foreach (@default) {
> $args->{$_} = $some_default unless exists $args->{$_};
> }
> croak if extra_keys($args);
> # do stuff
> }
I don’t know if this is just a silly example, but I’m not sure it
makes sense… why `die if extra_keys` when you’ve already made
sure that the set of keys can only be exactly @some_keys? Why set
a for all keys *unless* they exist, when you’ve already required
exactly the set of @some_keys to exist? And why use the same
default for all of these?
The code I use for such occasions is
sub foo {
my ( $args ) = @_;
my %default = ( foo => 1, bar => 1, baz => 'quux' );
my @optional_keys = qw( wibble wobble );
my %args = ( %default, map {
exists $args->{ $_ } ? ( $_ => delete $args->{ $_ } ) : ()
} keys %default, @optional_keys;
croak "I have no idea what you mean by @{[ keys %$args ]}" if %$args;
# ...
}
And I guess that could stand to be encapsulated for
sub foo {
my ( $args ) = @_;
my %args = defaultify_hash(
$args,
{ foo => 1, bar => 1, baz => 'quux' },
[ qw( wibble wobble ) ],
sub { croak "I have no idea what you mean by @_" },
);
# ...
}
But I’d be unlikely to ever depend on a module that provides
nothing but `defaultify_hash` unless it’s in core. Otherwise I’d
just copypaste the function…
But then, the likely candidate is Hash::Util, and if you’re going
to require that, you can already rewrite the code as
sub foo {
my ( $args ) = @_;
my %args = ( foo => 1, bar => 1, baz => 'quux' );
Hash::Util::lock_keys( %args, keys %args, qw( wibble wobble ) );
eval { %args = ( %args, $%args ) };
croak $@ if $@;
# ...
}
at which point trying to reuse this little code gets kind of
silly. Thinking about it, this may be how I’ll implement this
henceforth… I don’t like < 5.8.1 anyway because Unicode is too
important to me…
Regards,
--
#Aristotle
*AUTOLOAD=*_=sub{s/(.*)::(.*)/print$2,(",$\/"," ")[defined wantarray]/e;$1};
&Just->another->Perl->hacker;