2010-02-11 331 views
1

我正在使用Params::Validate进行验证,但在回调部分而不是定义直接匿名函数时,如果我尝试给出该​​匿名函数的引用,它将直接跳至错误记录区域,而不在块内打印消息(在传递正确值的情况)。为什么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 
    }; 
} 

记录实际的错误是一样的东西“未定义的子程序” ...

谁能告诉为什么会出现这种情况呢?

+1

你的错误将是立即可见,如果你已经缩进你人类阅读代码。 – 2010-02-11 15:46:35

+1

@SinanÜnür:这是怎么回事?错误是一种与缩进无关的误解。 – ysth 2010-02-11 18:17:21

+0

@ysth我发现越来越模糊的小额外符号在右边缘(或以扭曲的方式缠绕)越难以意识到它们在那里。 – 2010-02-11 22:05:29

回答

2

它失败的原因是因为你是调用子程序的引用,因此使用它的返回值,而不是传递实际的引用。除了使用

&$attributeCallback 

使用

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

$attributeCallback的已经是一个代码参考。我想你只想说

=> $attributeCallback 

代替

=> &$attributeCallback 

&$attributeCallback会调用该函数并好像是说

callbacks => {'Domain name validation failed' => 1 } 
+0

非常感谢你的回应.......现在它的工作 – Fedrick 2010-02-11 16:02:44