-1

私はという基本クラスを持っていますA

package A;
use strict;
use warnings;
use v5.12;

sub import {
    my $caller = caller;
say 'import called from ' . $caller;
    if (not $caller->can('has')) {
        no strict 'refs';
say "--> import has to $caller";
        *{"${caller}::has"} = sub { _attr($caller, @_) };
    }
}

sub _attr {
    my ($class, $name, $default) = @_;
    no strict 'refs';
    *{"${class}::$name"} = sub {
        my ($self, $value) = @_;
        $self->{$name} = $value if $value;
        return $self->{$name} // $default;
    };
}

1;

そして、子クラスがありBます:

package B;
use strict;
use warnings;
use lib './';
use base 'A';
use v5.12;

#use C;
A->import();

has 'ans' => 42;
say ans();

1;

このコードを実行しようとすると、構文エラーが発生しますが、これらの変更has 'ans' => 42'を加えるとhas('ans' => 42);、すべて正常に機能します。

または、クラスを作成した場合C

package C;
use strict;
use warnings;
use lib '.';
use base 'A';

1;

その後、すべてが機能するため、has 'ans'...このコードを変更する必要はありません。has(...

だから、なぜこれが起こるのか理解できません。has子モジュールにサブルーチンをインポートするにはどうすればよいですか?

4

1 に答える 1

1

他のモジュールにインポートhasするには、そのモジュールAに入れるだけuse Aです。

この行を置き換えます:

A->import();

と:

use A;

そしてそれはあなたが望むことをします。

手動で呼び出すと、実行時に行われるため、希望どおりに実行されません。インポートは、それを使用する行を解析する前に、それがサブルーチン名であることを知る->importために、コンパイル時に行われる必要があります。はコンパイル時のコマンドであるため、行が解析される前に有効になります。perlhasusehas

于 2013-01-26T22:39:19.160 に答える