2017-02-06 2 views
0

Я хочу знать внутреннюю работу метода импорта. Когда я искал то же самое, он отображал только, как использовать импорт в perl, чего я не требую.Внутренняя работа по импорту модуля в perl?

+3

Это поможет нам обеспечить полезный ответ, если бы вы описать, почему вы задаете вопрос. Что вы будете делать с информацией? – Borodin

ответ

3

Это зависит от каждого модуля, чтобы обеспечить метод import, если он хочет его предоставить. Большинство, которые делегировать задачу модуля Exporter, используя код, как

use Exporter qw(import); 

или старшего

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

Если это import метод, о котором вы спрашиваете, пожалуйста, обратитесь к the module's documentation для получения дополнительной информации.


Если, с другой стороны, вы спрашиваете, как динамически добавлять подпрограмму в пространстве имен, то это просто вопрос о присвоении суб реф к Глоб. Это означает, что

sub foo { ... } 

примерно эквивалентно

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

так что вы хотите

no strict qw(refs); 

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

Когда я искал для того же он отображается только, как использовать импорт в Perl, которого я не требую. Я хочу знать внутреннюю работу метода импорта .

Если вы хотите знать внутренности, проверьте внутренние элементы, то есть источник.

Ниже приведено то, что import подпрограмма от Exporter модуль делает. Пройдите через него, обратитесь к документации и 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

Смежные вопросы