Hi folks,
I've had a go a rolling my own subroutine validation code, and would welcome
any constructive comments on it.
My aim was to allow existing code to continue working using positional params,
as well as allowing varieties of -key=>value style arguments.
Gary
#!/usr/bin/perl -w
use strict;
my %_DEBUG=('new'=>0,'mysub'=>1);
my %_PARAMS=('mysub'=>'fred:s:others:a:');
# return debug info
sub debug {
my $caller=(caller(1))[3];
$caller=~s/^.*:://;
return (defined $_DEBUG{$caller}) ? $_DEBUG{$caller} : 0;
};
sub validate {
# work our who we are and what we want
my $caller=(caller(1))[3];
$caller=~s/^.*:://;
unless (defined $_PARAMS{$caller}) {
warn "validate: unknown routine $caller\n";
return undef;
}
my %resp=(); # hash to return
# now validate parameters
my $type=ref $_[0];
if ($type) { # hashref or arrayref
%resp=%{$_[0]};
} elsif ($_[0]=~/^-/) { # standard comma or arrow syntax
[EMAIL PROTECTED];
} else { # positional array passing
my @params=split(/:/,$_PARAMS{$caller});
while (@_) {
my $key=shift @params; # param name
my $type=shift @params; # string or array
if ($type eq 's') { # single value
$resp{$key}=shift @_;
} else { # handle array
if (ref $_[0]) { # hashref or arrayref
$resp{$key}=shift;
} else { # array
@[EMAIL PROTECTED]; # copy array to arrayref
$#_=-1; # then emty original array
}
}
} # while @_
}
foreach my $key (keys %resp) {
if ($key=~/^-(.*)$/) { # remove dash
$resp{$1}=$resp{$key}; # create correct key
delete $resp{$key}; # delete wrong one
}
}
return %resp;
};
sub mysub {
print "starting 'mysub'.\n" if (&debug);
my %resp=validate(@_);
return 0 unless (%resp);
foreach my $key (keys %resp) {
print "$key=$resp{$key}\n";
}
return 1;
}
print "1\n";
print "returned okay\n" if mysub(-fred=>'Ginger',-others=>{-ginger=>'Fred'});
print "2\n";
print "returned okay\n" if mysub(-fred,'Ginger',-others,'Fred');
print "3\n";
print "returned okay\n" if
mysub({-fred=>'Ginger',-others=>{-ginger=>'Fred'}});
print "4\n";
print "returned okay\n" if mysub(-fred=>'Ginger',-others=>{-ginger=>'Fred'});
--
Gary Stainburn
This email does not contain private or confidential material as it
may be snooped on by interested government parties for unknown
and undisclosed purposes - Regulation of Investigatory Powers Act, 2000
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>