我正在尝试编写一个函数来验证字母数字值的用户名,并且在失败的情况下它应该记录我的自定义错误消息并将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。 任何人都可以在这方面帮助我,有人可以解释我为什么会这样做吗?
答案 0 :(得分:3)
与on_fail
关联的回调不应返回值。它应该以某种方式die
。
在Params::Validate documentation中,on_fail
回调的说明如下:
on_fail => $callback
如果给定,将调用此回调 每当验证检查失败时。它 将用一个单独调用 参数,这将是一个字符串 描述失败。这很有用 如果你想让这个模块扔掉 异常作为对象而不是作为对象 例如,字符串。
此回调预计会死亡() 内部。如果没有,那么 验证将继续进行 不可预测的结果。
默认是简单地使用鲤鱼 module的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