2017-02-06 2 views
0

インポートメソッドの内部作業を知りたい。私が同じものを検索したときには、perlでのインポートの使い方しか表示されていませんでした。perlでモジュールをインポートする内部作業ですか?

+3

それはあなたが質問をしている理由を記述した場合に便利な答えを提供するために、私たちを助けるだろう。あなたはその情報で何をしますか? – Borodin

答えて

3

提供する場合は、importメソッドを提供することは各モジュールに任されています。これは、あなたが求めているかについてimport方法がある場合は

use Exporter qw(import); 

歳以上

use Exporter qw(); 
our @ISA = 'Exporter'; 

のようなコードを使用して輸出モジュールにタスクを委任しないこと大半は、より多くの情報のためthe module's documentationを参照してください。


、他の一方で、あなたが動的に名前空間にサブルーチンを追加する方法を求めているならば、それはグロブにサブREFを割り当てるだけの問題です。これは

sub foo { ... } 

は、あなたが、私は同じで検索すると、それは perlでインポートを使用する唯一の方法を表示

no strict qw(refs); 

*{ $dst_pkg . '::' . $sub_name } = \&{ $src_pkg . '::' . $sub_name }; 
2

をしたい

BEGIN { *foo = sub { ... }; } 

とほぼ同等であることを意味し私はそれを必要としません。私は インポートメソッドの内部作業を知りたいです。

内部を知りたい場合は、内部、つまりソースを確認してください。

は以下Exporterモジュールからimportサブルーチンが何をするかです。いくつかの「キーワード」がわからない場合は、ドキュメントとGoogleを参照してください。あなたが何か答えを見つけることができない場合は、ここでSOに尋ねてください。

sub import { 
    my $pkg = shift; 
    my $callpkg = caller($ExportLevel); 

    if ($pkg eq "Exporter" and @_ and $_[0] eq "import") { 
    *{$callpkg."::import"} = \&import; 
    return; 
    } 

    # We *need* to treat @{"$pkg\::EXPORT_FAIL"} since Carp uses it :-(
    my $exports = \@{"$pkg\::EXPORT"}; 
    # But, avoid creating things if they don't exist, which saves a couple of 
    # hundred bytes per package processed. 
    my $fail = ${$pkg . '::'}{EXPORT_FAIL} && \@{"$pkg\::EXPORT_FAIL"}; 
    return export $pkg, $callpkg, @_ 
    if $Verbose or $Debug or $fail && @$fail > 1; 
    my $export_cache = ($Cache{$pkg} ||= {}); 
    my $args = @_ or @_ = @$exports; 

    if ($args and not %$export_cache) { 
    s/^&//, $export_cache->{$_} = 1 
     foreach (@$exports, @{"$pkg\::EXPORT_OK"}); 
    } 
    my $heavy; 
    # Try very hard not to use {} and hence have to enter scope on the foreach 
    # We bomb out of the loop with last as soon as heavy is set. 
    if ($args or $fail) { 
    ($heavy = (/\W/ or $args and not exists $export_cache->{$_} 
       or $fail and @$fail and $_ eq $fail->[0])) and last 
       foreach (@_); 
    } else { 
    ($heavy = /\W/) and last 
     foreach (@_); 
    } 
    return export $pkg, $callpkg, ($args ? @_ :()) if $heavy; 
    local $SIG{__WARN__} = 
     sub {require Carp; &Carp::carp} if not $SIG{__WARN__}; 
    # shortcut for the common case of no type character 
    *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_; 
} 

完全なソース:https://metacpan.org/source/TODDR/Exporter-5.72/lib/Exporter.pm

関連する問題