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

指定すると、検証チェックが失敗するたびにこのコールバックが呼び出されます。単一のパラメーターで呼び出されます。これは、失敗を説明する文字列になります。これは、たとえば、このモジュールで例外を文字列ではなくオブジェクトとしてスローする場合に役立ちます。

このコールバックは、内部で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
于 2010-02-05T13:30:36.963 に答える