Почему обратный вызов Params :: Validate завершается неудачно для анонимной ссылки на функцию? - PullRequest
1 голос
/ 11 февраля 2010

Я использую 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
    };
}

Фактическая зарегистрированная ошибка - что-то вроде «Неопределенная подпрограмма» ...

Может кто-нибудь сказать, почему это происходит?

Ответы [ 2 ]

5 голосов
/ 11 февраля 2010
{ type => SCALAR, callbacks =>{'Domain name validation failed' => &$attributeCallback } }

$attributeCallback уже является ссылкой на код. Я думаю, вы просто хотите сказать

=> $attributeCallback

вместо

=> &$attributeCallback

&$attributeCallback вызовет функцию и все равно что сказать

callbacks => {'Domain name validation failed' => 1 }
2 голосов
/ 11 февраля 2010

Причина его сбоя в том, что вы вызываете ссылку подпрограммы и, следовательно, используете ее возвращаемое значение, а не передаете фактическую ссылку. Вместо использования

&$attributeCallback

Используйте

$attributeCallback
...