为什么我的Perl子程序返回假,即使参数是有效的?

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。请问有人能帮我解决这个问题吗?并且有人可以解释一下为什么会这样吗?


2
问题标题不要大写,名词和形容词不加标点符号,以便阅读。 - daotoad
@user267074,请查看我下面编辑过的答案,如果失败会返回‘0’。 - Christopher Bottoms
1
注明您正在使用Params::Validate会很有帮助。 - Ether
@Ether,那就是标点符号和大写字母的作用所在。@大家:你们不是e e cummings或bell hooks,请使用标点符号和大写字母。 - daotoad
1
E.E. Cummings甚至不是e e cummings。 - brian d foy
1个回答

3
on_fail关联的回调不应该返回值。它应该以某种方式die
Params::Validate文档中,有以下对on_fail回调的解释:

on_fail => $callback

如果给出,则每当验证检查失败时,都会调用此回调。它将使用一个参数进行调用,该参数将是描述失败的字符串。例如,如果您希望此模块将异常作为对象而不是字符串抛出,则这很有用。

预计此回调在内部死亡(die())。如果没有,则验证将继续进行,并产生不可预测的结果。

默认情况下,仅使用Carp模块的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

首先感谢您的回复,您能否告诉我在插入用户函数中,失败的情况下是否有任何方法可以返回值0而不是“die”。提前致谢。 - Fedrick
如果您删除eval语句,那么Params::Validate版本1.0实际上不会执行on_fail函数。有人知道如何让它真正起作用吗? - Neil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接