我有一个使用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调用它并且它不起作用。 我们将非常感谢您的帮助!!
答案 0 :(得分:4)
perldoc attributes
:
子程序属性的设置在编译时发生。
答案 1 :(得分:1)
更确切地说 - 属性在CHECK阶段处理。因此,当你评估/重新评估它们时,它们还没有完全填满。
但是,您可以尝试以下方法:
sub __RETRY : ATTR(CODE,BEGIN) {
迫使它。随着它的下一步工作,但也许你的里程.... [/ p>
eval { require "FOO.pm"; FOO->import(); FOO::foo() };