3

我正在尝试编写一个函数来验证用户名的字母数字值,如果失败,它应该记录我的自定义错误消息并将 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。任何人都可以在这方面帮助我吗?谁能解释我为什么这样做?

4

1 回答 1

3

与关联的回调on_fail不应该返回值。它应该以die某种方式。

Params::Validate 文档on_fail中,回调的解释如下:

on_fail => $callback

如果给定,只要验证检查失败,就会调用此回调。它将使用单个参数调用,该参数将是描述失败的字符串。例如,如果您希望此模块将异常作为对象而不是字符串抛出,这将很有用。

这个回调预计会在内部死掉()。如果没有,验证将继续进行, 结果不可预测

默认是简单地使用 Carp 模块的confes() 函数。

(强调我的)

以下代码通过将验证例程包装在一个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
于 2010-02-05T13:30:36.963 回答