Обычно вы делаете это для получения Exporter функциональных возможностей import () (это не единственный способ, но это распространенный метод, который работает):
package MyClass;
use strict;
use warnings;
use Exporter 'import'; # gives you Exporter's import() method directly
our @EXPORT_OK = qw(stuff more_stuff even_more_stuff);
... и тогда вы получите автоматически созданный метод import()
. Однако, если вы хотите сделать что-то дополнительное в import()
до того, как обычный метод получит параметры, не импортируйте import()
Exporter и определите свой собственный, который вызывает import()
Exporter после внесения любых изменений в список аргументов, который вам нужен:
package MyClass;
use strict;
use warnings;
use parent 'Exporter';
sub import
{
my ($class, @symbols) = @_;
# do something with @symbols, as appropriate for your application
# ...code here left as an exercise for the reader :)
# now call Exporter's import, and import to the right level
local $Exporter::ExportLevel = 1;
$class->SUPER::import(@symbols);
}
Однако мне интересно, зачем вам это нужно ... стандартное поведение умирания при пропуске нераспознанного символа, как правило, хорошо. Почему вы хотите игнорировать нераспознанные символы? ( Редактировать: Теперь я вижу, что вы хотите указать дополнительное поведение поверх импортируемых символов, что не является редкостью в Perl. Так что определение собственного метода import () определенно является подходом, чтобы захватить здесь эти значения.)
PS. если вы хотите импортировать только те символы, которые определены @EXPORT_OK, это может быть реализовано так:
@symbols = grep {
my $sym = $_;
grep { $_ eq $sym } @EXPORT_OK
} @symbols;