Question

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, $password, $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?

Was it helpful?

Solution

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top