3

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を使用して同じことをします、それは正しい仕事をします。

use FOO;
FOO::foo();

出力:

Executing subroutine
Executing Foo
You Pass

実際、私のコードでは、requireを使用して呼び出していますが、機能していません。あなたの助けは大歓迎です!

4

2 に答える 2

4

perldoc attributes

サブルーチン属性の設定は、コンパイル時に行われます。

于 2012-07-10T13:32:22.723 に答える
1

より正確には、属性はCHECKフェーズで処理されます。したがって、評価/要求したときに、それらはいっぱいになりませんでした。

ただし、次のことを試すことができます。

sub __RETRY : ATTR(CODE,BEGIN) {

それを強制します。それで次はうまくいくが、多分あなたのマイレージは……。

eval { require "FOO.pm"; FOO->import(); FOO::foo() };
于 2012-07-10T17:46:18.443 に答える