sub validateOptions { my( $hvOptions, $hvUserOpts )= @_; for my $key ( keys %$hvOptions ) { $hvOptions->{$key}= delete $hvUserOpts->{$key} if exists $hvUserOpts->{$key}; } if( %$hvUserOpts ) { my $subName= (caller(1))[3]; croak "$subName: Invalid options (", join(",",keys %$hvUserOpts),")"; } return $hvOptions; } BEGIN { my %defaults= ( Access=>READ_ONLY, Delimiter=>"/" ); sub Open { my( $keyName, $hvUserOpts )= @_; my $hvOpts= validOptions( {%defaults}, $hvUserOpts ); # ... } } BEGIN { my %defaults= ( Delimiter=>"/", Translate=>"text" ); sub Read { my( $handle, $hvUserOpts )= @_; my $hvOpts= validOptions( {%defaults}, $hvUserOpts ); # ... } }