Почему моя подпрограмма Perl возвращает false, даже если параметры верны? - PullRequest
3 голосов
/ 05 февраля 2010

Я пытаюсь написать функцию, которая проверяет имя пользователя для буквенно-цифрового значения, и в случае сбоя она должна записать мое пользовательское сообщение об ошибке и вернуть 0 вызываемой функции вместо смерти:

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 ";
}

С приведенным выше кодом я столкнулся с проблемой, как будто он все еще возвращает 0 в случае успеха. Кто-нибудь может помочь мне в этом вопросе, и кто-нибудь может объяснить, почему это так?

1 Ответ

3 голосов
/ 05 февраля 2010

Обратный вызов, связанный с on_fail, не должен возвращать значение. Предполагается, что die в некотором роде.

В документации Params :: Validate приведено следующее объяснение обратного вызова on_fail:

on_fail => $callback

Если дано, этот обратный вызов будет вызван всякий раз, когда проверка не проходит. Это будет вызываться с одним параметр, который будет строкой описывая неудачу. Это полезно если вы хотите, чтобы этот модуль бросил исключения как объекты, а не как строки, например.

Ожидается, что этот обратный вызов умрет () внутренне. Если это не так, проверка будет продолжена, с непредсказуемые результаты.

По умолчанию просто использовать карпа Функция confess () модуля.

(акцент мой)

Следующий код работает, заключая процедуру проверки в блок 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;
     }
}

Выходные данные:

user, password, user@example.com, 99
return value: 1
error return value: 0
...