Perché il mio subroutine Perl restituire false anche se i parametri sono validi?
-
18-09-2019 - |
Domanda
Sto cercando di scrivere una funzione che convalida il nome utente per un valore alfanumerico e, nel caso di fallimento si deve registrare il mio messaggio di errore personalizzato e tornare 0 alla detta funzione invece di morire-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 ";
}
Con il codice qui sopra io sono di fronte un problema come è ancora il ritorno 0 in caso di successo. Qualcuno può per favore mi aiuti in questo senso e qualcuno mi potrebbe spiegare il motivo per cui lo sta facendo?
Soluzione
Il callback associato con on_fail
non dovrebbe restituire un valore. Si suppone che die
in qualche modo.
Parametri :: documentazione Convalida , è la seguente spiegazione per la richiamata on_fail
:
on_fail => $callback
Se presente, tale callback verrà chiamata ogni volta che un controllo di convalida non riesce. esso sarà chiamato con un singolo parametro, che sarà una stringa descritto il guasto. Questo è utile se si desidera avere questo modulo tiro come oggetti piuttosto che come eccezioni stringhe, per esempio.
Questo richiamata è atteso a morire () internamente. In caso contrario, il convalida procederà poi, con imprevedibili risultati.
Il valore predefinito è di utilizzare semplicemente il Carp confesso di modulo () la funzione.
(sottolineatura mia)
Il seguente codice funziona avvolgendo la routine di convalida in un blocco eval
:
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;
}
}
L'output di questo è:
user, password, user@example.com, 99
return value: 1
error return value: 0