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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top