Why does my Perl subroutine return false even though the parameters are valid?
I am trying to write a function which validates the username for an alphanumeric value and in the case of failure it should log my custom error message and return 0 to the called function instead of die-ing:
sub insertUser{
my ( $username, $passwor开发者_开发百科d, $email, $name) = validate_pos( @_,
{ type => SCALAR,
regex => qr/^\w+$/,
on_fail => { $err->error("username validation failed"),return 0 }
},
{ type => SCALAR },
{ type => SCALAR },
{ type => SCALAR ,optional => 1,default => 99});
print "$username, $password, $email, $name ";
}
With the above code I am facing a problem like it's still returning 0 in the success case. Can anybody please help me in this regard and could anyone explain me why it is doing so?
The callback associated with on_fail
is not supposed to return a value. It is supposed to die
in some way.
In the Params::Validate documentation, is the following explanation for the on_fail
callback:
on_fail => $callback
If given, this callback will be called whenever a validation check fails. It will be called with a single parameter, which will be a string describing the failure. This is useful if you wish to have this module throw exceptions as objects rather than as strings, for example.
This callback is expected to die() internally. If it does not, the validation will proceed onwards, with unpredictable results.
The default is to simply use the Carp module's confess() function.
(emphasis mine)
The following code works by wrapping the validation routine in an eval
block:
use strict;
use warnings;
use Params::Validate qw{ :all};
my $return_value = insertUser('user','password','user@example.com'); #passes
print "return value: $return_value\n";
my $error_return_value = insertUser('user*','password','user@example.com');
print "error return value: $error_return_value\n";
sub insertUser{
eval{
my ( $username, $password, $email, $name) = validate_pos( @_,
{
type => SCALAR,
regex => qr/^\w+$/,
on_fail => sub{ die "username validation failed"},
},
{ type => SCALAR },
{ type => SCALAR },
{ type => SCALAR ,optional => 1,default => 99});
print "$username, $password, $email, $name \n";
};
if($@){
return 0;
}else{
return 1;
}
}
The output from this is:
user, password, user@example.com, 99
return value: 1
error return value: 0
精彩评论