2010-02-05 2 views
3

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

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 в случае успеха. Может кто-нибудь, пожалуйста, помогите мне в этом отношении и может ли кто-нибудь объяснить мне, почему это так?

+2

вопрос названия не вопрос не капитализированный неискушенные существительные прилагательные трудные чтения – daotoad

+0

@ user267074 См. мой отредактированный ответ bel ow, который возвращает «0» для отказа. –

+1

Было бы полезно отметить, что вы используете Params :: Validate. – Ether

ответ

3

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

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

on_fail => $callback

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

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

По умолчанию используется только функция Carpe с исповедью().

(курсив мой)

Следующий код работает обертывание процедуры проверки в eval блоке:

use strict; 
use warnings; 
use Params::Validate qw{ :all}; 
my $return_value = insertUser('user','password','[email protected]'); #passes 
print "return value: $return_value\n"; 

my $error_return_value = insertUser('user*','password','[email protected]'); 
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([email protected]){ 
     return 0; 
    }else{ 
     return 1; 
    } 
} 

Выход из этого:

user, password, [email protected], 99 
return value: 1 
error return value: 0 
+0

во-первых, спасибо за ваш ответ, не могли бы вы сказать, что «есть ли способ, которым он возвращает значение 0» в случае отказа вместо «die» вставить функцию пользователя. Заранее спасибо – Fedrick

+0

Если вы удалите оператор 'eval', то этот код фактически не выполняет функцию' on_fail' для Params :: Validate версии 1.0. Кто-нибудь знает, как заставить это работать? – Neil

Смежные вопросы