Обычно, вы могли бы сделать это, чтобы получить импортную функциональность Exporter «s() (это не единственный способ, но это общий метод, который работает):
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()
, прежде чем нормальный метод получит удержание параметров, то не импортируйте Exporter import()
и определите свой собственный, который вызывает import()
экспортера после внесения любых изменений в список аргументов, который вам нужен :
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;
Пройти на что? Экспортер? Можете ли вы опубликовать код, указывающий, что вы пытаетесь сделать? – mob
Да, Экспортеру. – JoelFan