Как объединить импорт пакетов в единый пакет?
Обычно, когда я пишу программу perl. Я использовал следующий пакет.
use strict ;
use warnings ;
use Data::Dumper ;
Теперь, я хочу так, я не буду включать весь этот пакет для каждой программы. для этого
У меня будет весь пакет в моем собственном пакете. как показано ниже.
my_packages.pm
package my_packages ;
{
use strict ;
use warnings ;
use Data::Dumper;
}
1;
Итак, если я добавлю my_packages.pm в perl-программу, он должен иметь все вышеперечисленные пакеты.
Собственно, я сделал это экспериментирование. Но я не могу этого добиться.
что означает, когда я использую my_packages. Я не могу получить функциональность "использовать строгие, использовать предупреждения, использовать Data:: Dumper".
Кто-то поможет мне решить эту проблему.....
Ответы
Ответ 1
Посмотрите ToolSet
, который делает для вас все грязные операции импорта.
Пример использования из pod:
Создание набора инструментов:
# My/Tools.pm
package My::Tools;
use base 'ToolSet';
ToolSet->use_pragma( 'strict' );
ToolSet->use_pragma( 'warnings' );
ToolSet->use_pragma( qw/feature say switch/ ); # perl 5.10
# define exports from other modules
ToolSet->export(
'Carp' => undef, # get the defaults
'Scalar::Util' => 'refaddr', # or a specific list
);
# define exports from this module
our @EXPORT = qw( shout );
sub shout { print uc shift };
1; # modules must return true
Использование набора инструментов:
use My::Tools;
# strict is on
# warnings are on
# Carp and refaddr are imported
carp "We can carp!";
print refaddr [];
shout "We can shout, too!";
/I3az/
Ответ 2
Это сложнее, чем вы ожидаете.
-
Для таких прагм как strict
и warnings
вы можете передать их.
-
Для модулей, которые не экспортируют такие функции, как объектно-ориентированные, он будет работать.
-
Однако для модулей, которые экспортируются по умолчанию, например Data:: Dumper (он дает вам функцию Dumper()
в пакете вызывающего), это сложнее.
Вы можете заставить его работать, сообщив Exporter
, что есть дополнительный слой магии:
Итак, вы можете сделать:
package my_packages;
use strict;
use warnings;
use Data::Dumper;
use IO::Socket;
$Exporter::ExportLevel = 1; # Tell Exporter to export to the caller
sub import {
# Enable this in the callers package
strict->import; # pragma in caller
warnings->import; # pragma in caller
Data::Dumper->import; # Adds Dumper() to caller
# No need for IO::Socket since it OO.
return 1;
}
1;
Для трех модулей это вряд ли стоит того.
Ответ 3
Смотрите это:
package Foo;
use warnings;
sub import {
warnings->import;
}
1;
И теперь:
$ perl <<CUT
> use Foo;
> \$a = 5; # backslash just to keep the $ from being eaten by shell
> CUT
Name "main::a" used only once: possible typo at - line 2.
Взято из Modern::Perl.