Attribute :: Handler使用vs vs require的行为

时间:2012-07-10 13:28:21

标签: perl

我有一个使用Attribute :: Handler

实现的perl模块
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;

现在,当我使用require调用此模块并调用函数foo()时,它只执行foo的print语句。

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

输出:

Executing Foo

但是我使用它做同样的事情,它做了正确的工作。

use FOO;
FOO::foo();

输出:

Executing subroutine
Executing Foo
You Pass

实际上,在我的代码中,我使用require调用它并且它不起作用。 我们将非常感谢您的帮助!!

2 个答案:

答案 0 :(得分:4)

perldoc attributes

  

子程序属性的设置在编译时发生。

答案 1 :(得分:1)

更确切地说 - 属性在CHECK阶段处理。因此,当你评估/重新评估它们时,它们还没有完全填满。

但是,您可以尝试以下方法:

sub __RETRY : ATTR(CODE,BEGIN) {

迫使它。随着它的下一步工作,但也许你的里程.... [/ p>

eval { require "FOO.pm"; FOO->import(); FOO::foo() };
相关问题