2010-02-11 330 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