in reply to Getting subroutine @_ w/ defaults
#!/usr/bin/perl -w # the defaults that *MUST* be defined # the default value is element 1 # each subsequent element is an acceptable value # use quotemeta or \Q\E if you need to # all matching is done with the global flag on, # so anchor if you need to # use "" for any value (or qr{^.*$}iso) my %DEFAULTS = ( FOLDERS_FIRST => [1,0], SORT_ORDER => [qw/ A D /], SORT_BY => [qw/ N M S/], ALLOW_QUERY => [1, 0], # allows ?N=A and teh like CACHING => [0, 1], EMIT_HEADER => [1, 0, 'text/html', [ qr{ (\s? \w+ \/ \w+ \s? \;?) }iosx, sub { my ($val, $matchesref, @matches) = @_; carp("uh oh") if length($val) != length(join +'',@matches); $$matchesref = 1; # we'll warn, but we'll still accept the val +ue } ] ], ,); my %OPTIONALS = ( CACHE_WHERE => [""], # here dummy CACHE_AS => [""], # user here CACHE_SIZE => [""], # you tell me KEY_SIZE => [qr{^\d+$}], # once again, you tell me ); use Carp; use Data::Dumper; print Dumper new('satin', SORT_BY => 'N', EMIT_HEADER => 'text/plain', CACHE_WHERE => 'on the moooon', KEY_SIZE => -1,); print Dumper new('satin', SORT_BY => 'N', EMIT_HEADER => 'text/plain; charset=US-ASCII', KEY_SIZE => 10,); sub new { my ($satin, %options) = @_; my %me = map { $_ => $DEFAULTS{$_}->[0] } keys %DEFAULTS; for my $optionkey(keys %options) { my @DEFS; @DEFS = @{$DEFAULTS{$optionkey}} if exists $DEFAULTS{$optionke +y}; @DEFS = @{$OPTIONALS{$optionkey}} if exists $OPTIONALS{$option +key}; if(@DEFS) { my $optv = $options{$optionkey}; my $matches = 0; for my $pattern ( @DEFS ) { if (ref($pattern) eq 'ARRAY') { my ($pat, $sub ) = @$pattern; $sub->( $optv, \$matches, $optv =~ m{$pat}g); }elsif( $optv =~ m{$pattern}g ) { $matches++; last; } } if( $matches ) { $me{$optionkey} = $optv; } else { carp "`$optv' is not a valid value for `$optionkey' -- + please read the pod"; } } else { carp "`$optionkey' is not a valid option -- please read th +e pod."; } } return bless \%me, $satin; # i have not sinnid }
______crazyinsomniac_____________________________ Of all the things I've lost, I miss my mind the most. perl -e "$q=$_;map({chr unpack qq;H*;,$_}split(q;;,q*H*));print;$q/$q;" |
|
---|