sub validate_data($$)
{
my $q = shift;
my $tmpl = shift;
my %data = ();
my %invalid = ();
foreach my $key (keys %{$tmpl})
{
my $value = $q->param($key);
if (&{$tmpl->{$key}}($value))
{
$data{$key} = $value if defined $value;
} else {
$invalid{$key} = 1;
}
}
return (\%data, \%invalid);
}
####
sub is_string
{
return sub {
return $_[0] ne "";
};
}
sub is_number
{
return sub {
return $_[0] =~ m{^\d+$};
};
}
sub is_range($$)
{
(my $l, my $u) = @_;
return sub {
return $_[0] =~ m{^\d+$} && $_[0] >= $l && $_[0] <= $u;
};
}
sub is_in_list($)
{
my $l = shift;
return sub {
return (grep { $_[0] eq $_ } @{$l}) != 0;
};
}
sub is_email
{
return sub {
return $_[0] =~ m{^[-.+a-z0-9]+\@[-.+a-z0-9]+$}i;
};
}
sub is_required
{
my $t = shift;
return sub {
defined $_[0] and &{$t}($_[0]);
};
}
sub is_optional
{
my $t = shift;
return sub {
return defined $_[0] ? &{$t}($_[0]) : 1;
};
}
sub is_equal
{
my $v = shift;
return sub {
$_[0] eq $v ? 1 : 0;
}
}
####
my %fields = (
name => is_required(is_string()),
email => is_required(is_email()),
phone => is_optional(is_phone()),
);