2012-07-10 27 views
2

我有使用屬性::處理程序現在屬性::處理程序與使用行爲VS需要

package FOO; 

use strict; 
use warnings; 

use Attribute::Handlers; 

use base 'Exporter'; 
our @EXPORT = qw(__RETRY); 

sub __RETRY : ATTR(CODE) { 
    my ($pkg, $sym, $code) = @_; 

    no warnings 'redefine'; 

    *{ $sym } = sub 
    { 
     my $self = $_[0]; 
     my $result; 
     print ("Executing subroutine\n"); 
     $result = $code->(); 
     if ($result) 
     { 
      print "You Pass\n"; 
     } 
     else 
     { 
      print "You Fail\n"; 
     } 
    } 
} 

sub foo : __RETRY 
{ 
    print "Executing Foo\n"; 
    return 1; 
} 

1; 

Perl模塊實現的,當我使用需要調用此模塊,並調用函數foo(),它只有執行foo的打印語句。

require "FOO.pm"; 
FOO->import(); 
FOO::foo(); 

輸出:

Executing Foo 

但後來我做了使用用途相同,它的正確工作。

use FOO; 
FOO::foo(); 

輸出:

Executing subroutine 
Executing Foo 
You Pass 

其實,在我的代碼我使用需要調用它,它不工作。 我們將非常感謝您的幫助!

回答

3

perldoc attributes

子程序的設置屬性發生在編譯時。

+0

謝謝理查德,這是否意味着我不能做到「要求」? – rpg 2012-07-10 13:33:31

+0

這意味着,是的。 'use'在BEGIN階段(「編譯時間」)運行,而'require'是一個運行時函數。 – 2012-07-10 13:35:38

+1

「使用」正是:BEGIN {require Module;模塊 - >導入(LIST); }請參閱http://perldoc.perl.org/functions/use.html – jm666 2012-07-10 15:41:10

1

更確切地說 - 屬性在CHECK階段處理。所以,當你評估/要求他們沒有滿員時。

但是,你可以嘗試以下方法:

sub __RETRY : ATTR(CODE,BEGIN) { 

給力了。隨着它的下一個作品,但也許你的里程是......

eval { require "FOO.pm"; FOO->import(); FOO::foo() }; 
+0

我試過這個解決方案,但它對我不起作用。 :( – rpg 2012-07-11 06:49:05

+0

+1,這顯示了一些希望,但不幸的是它不適合我:( – rpg 2012-07-12 07:28:07

+0

國際海事組織,你知道perl比我好多了)所以對不起,我現在沒有任何想法...這裏有一些其他的Perl -gurus - 也許他們可以提供更多的幫助當你試圖要求模塊時,模塊名稱是在變量中嗎?因此編譯器不知道它(它不是詞法),因此可能無法將它推入BEGIN相... – jm666 2012-07-12 14:37:44

相關問題