Я хочу знать внутреннюю работу метода импорта. Когда я искал то же самое, он отображал только, как использовать импорт в perl, чего я не требую.Внутренняя работа по импорту модуля в perl?
ответ
Это зависит от каждого модуля, чтобы обеспечить метод 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 };
Когда я искал для того же он отображается только, как использовать импорт в 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
Это поможет нам обеспечить полезный ответ, если бы вы описать, почему вы задаете вопрос. Что вы будете делать с информацией? – Borodin