Почему моя подпрограмма Perl возвращает false, даже если параметры допустимы?
-
18-09-2019 - |
Вопрос
Я пытаюсь написать функцию, которая проверяет имя пользователя на наличие буквенно-цифрового значения, и в случае сбоя она должна зарегистрировать мое пользовательское сообщение об ошибке и вернуть 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 в случае успеха.Кто-нибудь, пожалуйста, может помочь мне в этом отношении и кто-нибудь может объяснить мне, почему это происходит?
Решение
Обратный вызов, связанный с on_fail
не должен возвращать значение.Предполагается, что это die
в некотором роде.
В Параметры:: Проверка документации, является следующим объяснением для on_fail
обратный вызов:
on_fail => $callback
Если задано, этот обратный вызов будет вызываться всякий раз, когда проверка проверки завершается неудачей.Он будет вызван с единственным параметром, который будет представлять собой строку , описывающую сбой.Это полезно если вы хотите, чтобы этот модуль выдавал исключения, например, в виде объектов, а не в виде строк.
Ожидается, что этот обратный вызов завершится () внутренне.Если этого не произойдет, проверка будет продолжена с непредсказуемый Результаты.
По умолчанию используется просто функция confess() модуля Carp .
(курсив мой)
Следующий код работает путем обертывания процедуры проверки в 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