1

私は検証にParams::Validateを使用していますが、直接匿名関数を定義する代わりにコールバック セクションで、その匿名関数への参照を与えようとすると、ブロック内にメッセージを出力せずにエラー ログ領域に直接ジャンプします (正しい値を渡す場合)。

use Params::Validate qw(:all);
our $attributeCallback = sub {
    my $parameter = shift;
    $parameter =~ m/^\w+$/i ;
};

sub getSingleValue {
    eval { 
        my ($domainName, $attribute) = validate_pos( @_,
            { 
                type => SCALAR, 
                callbacks => {
                    'Domain name validation failed' => &$attributeCallback
                } 
            },
            { 
                type => SCALAR, 
                callbacks => {
                    'Attribute name validation failed' => sub { 
                        $_[0] =~ m/[\w.-]+$/i } 
                } 
            }
        );
        print "domain name is $domainName and attribute is $attribute";
        1;
    } 
        or do { 
        # catch 
        # Error Logging Area
    };
}

ログに記録された実際のエラーは、 「未定義のサブルーチン」のようなものです...

なぜこれが起こっているのか誰にもわかりますか?

4

2 に答える 2

5
{ type => SCALAR, callbacks =>{'Domain name validation failed' => &$attributeCallback } }

$attributeCallbackすでにコードリファレンスです。私はあなたが言いたいだけだと思います

=> $attributeCallback

それ以外の

=> &$attributeCallback

&$attributeCallback関数を呼び出して、

callbacks => {'Domain name validation failed' => 1 }
于 2010-02-11T15:35:14.317 に答える
2

失敗する理由は、実際の参照を渡すのではなく、サブルーチン参照を呼び出しているため、その戻り値を使用しているためです。使用する代わりに

&$attributeCallback

使用する

$attributeCallback
于 2010-02-11T15:34:31.883 に答える