为什么即使参数有效,我的Perl子例程也会返回false?

时间:2010-02-05 13:12:28

标签: perl validation params

我正在尝试编写一个函数来验证字母数字值的用户名,并且在失败的情况下它应该记录我的自定义错误消息并将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 个答案:

答案 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